我有一个带有以下签名的泛型方法:
Broker.GetMessages<TType>();
Run Code Online (Sandbox Code Playgroud)
它可以通过以下方式使用:
IList<IEmailMessage> emails = Broker.GetMessages<IEmailMessage>();
Run Code Online (Sandbox Code Playgroud)
我需要为这个结构的数组中可用的一系列类型执行此方法:
var messageTypes = new [] { typeof(IEmailMessage), typeof(IFaxMessage) }
Run Code Online (Sandbox Code Playgroud)
我的最终结果应该是这样的:
foreach ( IMessage message in messageTypes)
{
Broker.GetMessages<xxx>();
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何转换Type以将其作为泛型传递.我知道我可以使用反射调用方法,但我想知道是否有更好的方法来实现这一点.我可以更改数组结构,但不能更改方法签名.
不,你需要使用反射.你已经有一半了,因为你已经有了Type[]- 你任何时候使用typeof,你都会前往反思之路.泛型适用于在编译时知道类型的情况 - 尽管您已将这些类型硬编码到messageTypes数组中,但仍然会从方法的调用中断开类型的编译时知识.
这样做非常简单:
var definition = typeof(Broker).GetMethod("GetMessages");
var generic = definition.MakeGenericMethod(type);
var result = generic.Invoke(null);
Run Code Online (Sandbox Code Playgroud)