我有一个具有以下签名的通用方法:
Broker.GetMessages<TType>();
可以通过以下方式使用:
IList<IEmailMessage> emails = Broker.GetMessages<IEmailMessage>();
我需要为这个结构的数组中可用的一系列类型执行这个方法:
var messageTypes = new [] { typeof(IEmailMessage), typeof(IFaxMessage) }
我的最终结果应该是这样的:
foreach ( IMessage message in messageTypes)
{
Broker.GetMessages<xxx>();
}
问题是我不知道如何隐藏类型以便将其作为泛型传递。我知道我可以使用反射来调用该方法,但我想知道是否有更好的方法来实现这一点。 我可以更改数组结构,但不能更改方法签名。
最佳答案
不,您需要使用反射。鉴于您有一个 Type[]
,您已经完成了一半 - 任何时候您使用 typeof
,您都在朝着反射(reflection)的方向前进。泛型适用于您在编译时知道类型的情况 - 尽管您已将这些类型硬编码到 messageTypes
数组中,但您仍然断开了类型的编译时知识来自方法的调用。
这样做相当简单:
var definition = typeof(Broker).GetMethod("GetMessages");
var generic = definition.MakeGenericMethod(type);
var result = generic.Invoke(null);
关于c# - 调用泛型方法的类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395206/