c# - 调用泛型方法的类型数组

标签 c# generics

我有一个具有以下签名的通用方法:

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/

相关文章:

c# - 在数据绑定(bind)表达式中调用具有 void 返回类型的方法

java - 如何在接口(interface)中使用泛型方法参数?

java - 泛型构造函数在 Java 中的作用是什么?

c# - 将文字编码不正确的字符串(例如 "ñ")转换为 ISO-8859-1 (Latin1) H

c# - 任何人看到这个错误 : Could not load file or assembly 'System.EnterpriseServices.Wrapper.dll' ?

c# - 删除未提交的 DGV 新行

c# - 对 Windows Phone 8 应用程序中的相同图标文件感到困惑

c# - Curiously Recurring Template Pattern 和泛型约束 (C#)

C# 泛型不识别类型

java - 我可以手动重写继承的方法吗?