3

次のシグネチャを持つジェネリック メソッドがあります。

Broker.GetMessages<TType>();

次の方法で使用できます。

IList<IEmailMessage> emails = Broker.GetMessages<IEmailMessage>();

この構造体の配列内で使用可能な一連の型に対して、このメソッドを実行する必要があります。

var messageTypes = new [] { typeof(IEmailMessage), typeof(IFaxMessage) }

私の最終結果は次のようになります。

foreach ( IMessage message in messageTypes)
{
   Broker.GetMessages<xxx>();
}

問題は、タイプをジェネリックとして渡すために変換する方法がわからないことです。リフレクションを使用してメソッドを呼び出すことができることはわかっていますが、これを達成するためのより良い方法があるかどうか疑問に思っていました。配列構造は変更できますが、メソッド シグネチャは変更できません。

4

1 に答える 1

5

いいえ、リフレクションを使用する必要があります。Type[]- を使用するときはいつでもtypeof、リフレクションへの道を進んでいることになります。ジェネリックは、コンパイル時に型がわかっている場合を対象としています。これらの型をmessageTypes配列にハードコーディングしても、メソッドの呼び出しからコンパイル時の型の知識を切り離しています。

これを行うのはかなり簡単です:

var definition = typeof(Broker).GetMethod("GetMessages");
var generic = definition.MakeGenericMethod(type);
var result = generic.Invoke(null);
于 2013-01-18T08:48:18.750 に答える