2011-03-18 9 views
5

ジェネリックタイプに固有ではないジェネリックインターフェイスのメンバへの参照をランタイムが許可した場合、他の誰かが役に立つかもしれないと感じていますか?私は通常の "回避策"はジェネリックインターフェイスのベースとして非ジェネリックインターフェイスを作成することですが、その基本インターフェイスに対して有効な理由は基本的に自動ですか?例えばジェネリックインターフェイスへの抽象的な参照

、次のインターフェイス与えられた:他の(私はこれに対して議論を聞いて興味

public void LogProcessor(IProcessor<> item) 
{ 
     Trace.WriteLine(item.Name); 
} 

:私は自動的にこのような何かをできるようにする便利なことだと思う

public interface IProcessor<T> 
{ 
    string Name { get; } 
    void Process(T item); 
} 

を「怠け者ではなく、単にベースインターフェイスを書く」よりも)。

public void LogProcessor<T>(IProcessor<T> item) 
{ 
    Trace.WriteLine(item.Name); 
} 
+1

どのようにあなたはそこに何を意味するのか分かりますか? –

+1

このような機能を処理するには、C#を動的に型指定する必要があるようです。 –

+1

Paul Sasik。コンパイル後のそのようなコードは、ジェネリックのための基本インターフェースを生成することができます。これはアイデアですが、いくつかの問題を引き起こす可能性があります。 – Evgeny

答えて

7

は、あなただけの一般的な方法を使用することができます。このようなことは、Microsoftのフレームワーク開発者の仕事とテストの大きな部分です。そのため、ベースインターフェイスを追加する方が簡単です。 しかし、とにかくあなたはマイクロソフトのフォーラムにあなたのアイデアを投稿することができます

+0

私はできますが、私はTが何であるか分からない文脈はどうですか?たとえば、IProcessor <>インターフェイスを実装するアセンブリ内のすべてのクラスを動的にロード(およびログ名を付けたい場合)(t.GetInterface(typeof(IProcessor <>)を使用してインターフェイスをチェックできます) != null)? – WuffaloWill

+0

@WuffaloWIll:ジェネリックメソッドをチェックしてから、リフレクションを使用してジェネリックメソッド(MethodInfo.MakeGenericMethod:http://msdn.microsoft.com/en-us/library/system.reflectionで適切なタイプ)を呼び出すことができます。 methodinfo.makegenericmethod.aspx)。きれいではありませんが、多くの場合うまくいきます。しかし、あなたがrelfectionを使用していない通常のAPIでは、これは完全に機能します。 –

+0

@ Reed-返事をありがとう。私は、「通常のAPI」で汎用メソッドを使用する方法を理解しています。私は私の元の反応を「私は何がTではないのか? – WuffaloWill

0

ない共通言語仕様である主な理由:

関連する問題