です:このコードはうまく機能ジェネリックパラメータを確認し、私は辞書のキーとして一般的なパラメータを使用して、一般的な方法で持っている具体的なタイプ
public void MyMethod<T>(IEnumerable<T> myCollection) where T : IMyInterface
{
var smthg = MyDictionary[typeof(T)];
//...
}
を。しかし、もちろん、あなたがそのようにそれを呼び出す場合:
MyMethod(myCollectionOfT.Cast<IMyInterface>());
T
IMyInterface
(IMyInterface
を実装していないクラス)になり、辞書が(正常)キーを持っていません。
問題が発生したときに、私は簡単に例外がスローされていることができます。
if (typeof(T) == typeof(IMyInterface)) throw new ArgumentException("The generic parameter should be strongly typed.", "T");
をしかし、あなたの呼び出しは、クラスの代わりにインターフェイスを使用する場合、コンパイル時エラーを持つ方法(制約または何か)がありますそれを実装している?
編集:
Dスタンレーは、溶液が得られた:new()
制約はT
インターフェイスないことgaranteeう。
あなたはそれがただインターフェイスではないことを望みますか?もしそれが 'IMyInterface'を拡張した_different_インタフェースだったらどうでしょうか? –
インタフェースを使用できないようにする唯一の制約は、具体的な型にパブリックのパラメータのないコンストラクタが必要であることを要求する 'new()'です。 –
また、辞書であなたは何をしていますか?下のコードが本当に_generic_でない場合は、ジェネリックを使用していると思います。代わりに過負荷が必要なのでしょうか? –