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 回答