2009-07-15 16 views
1

私は方法があります。検出インタフェース

public void StoreUsingKey<T>(T value) where T : class, new() { 
     var idModel = value as IIDModel; 
     if (idModel != null) 
      Store<T>(idModel); 

     AddToCacheUsingKey(value); 
    } 

私はIIDModelvalueパラメータの実装に基づいて、次のメソッドを呼び出す必要に応じたいと思います。

public void Store<T>(T value) where T : class, IIDModel, new() { 
     AddModelToCache(value); 
    } 

StoreUsingKey<T>からvalueパラメータはIIDModelを実装することStore<T>を伝える方法はありますか?それとも私はこれについて間違った方法をとっていますか?各方法からnew()制約を削除リッチ

回答

コードが動作することを可能にします。この問題は、インスタンス化できるオブジェクトとしてインターフェースを渡そうとしていたことが原因でした。

答えて

1

各方法から制約を削除するとコードが機能します。この問題は、インスタンス化できるオブジェクトとしてインターフェースを渡そうとしていたことが原因でした。

5

あなたは既にあります。 Store < T>メソッドにIIDModel制約を設定することによって、valueパラメーターがIIDModelを実装することが保証されます。

ああ、あなたは今何を言っているのか分かります。これはどう:まだ、再び

public void StoreUsingKey<T>(T value) where T : class, new() { 
       if (idModel is IIDModel) 
         Store<T>((IIDModel)idModel); 

       AddToCacheUsingKey(value); 
     } 

編集: Tinisterは正しいです。これだけではこのトリックはできません。ただし、StoreメソッドがJoel Coehoorn postedのように見える場合は、動作するはずです。

+0

しかし、StoreUsingKey メソッドにはこの制約はありません。 Store を選択的に呼び出すにはどうすればよいですか?上記のエラーの例は、「IIDModel」から「T」に変換できません。 – kim3er

+0

これは動作していないようです: 'IIDModel'は、ジェネリック型またはメソッドでパラメータ 'T'として使用するためにパブリックパラメータレスコンストラクタを持つ非抽象型でなければなりません 'Store (T)' – Tinister

+0

、クラスの制約は赤い稚魚でした。私は過度に制限的だった。両方のメソッドからクラス制約を削除すると、コードが動作し始めます。ご協力いただきありがとうございます。 – kim3er

2
public void Store(IIDModel value) { 
    AddModelToCache(value); 
} 
+0

申し訳ありませんが、私はもっと明示されていたはずです。 AddModelToCacheメソッドは、性質上も一般的です。 – kim3er

関連する問題