使用reflection调用generics重载方法

我需要使用reflection来调用重载方法。 我的课程如下:

public static Transformer { //Overloaded method with generics parameter. First Transform Method public static TranformerResult Transform(object [] entities, List dataContract) where T:class { return transformerResult; } //Overloaded method without generics parameter. Second Transform Method public static TranformerResult Transform(object entities, Type dataContract) { return transformerResult; } } public class TransformerResult { public List GetTypes() where T:class { } } 

我尝试使用以下语法调用第一个Transform方法:

 GetMethod(“Transform”,(BindingFlags.Static | BindingFlags.Public), null, new Type[](){typeof(object[]),typeof(List}, null) 

但我得到第二种Transform方法。

我的目的是在transformerResult上调用GetType。 transformerResult是一个返回第一个转换方法的调用的对象。

任何人都可以帮我编写C#代码来实现我的意图吗?

谢谢,Mahir

您遇到问题的原因是您正在寻找的特定方法是通用的。 该方法的一种类型基于该方法的通用参数。 这将为您提供一些捕获22.generics参数与方法相关联,因此在您拥有方法本身之前,无法正确构造方法的类型数组。

针对此特定方案的一个解决方案就是抓住第一个通用方法。

 var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First(); 

除非这样做: typeof(List<>)你需要对你做的事情有点棘手,类似于我对这篇文章所做的事情: http : //www.aaron-powell.com/posts /2010-04-08-reflection-and-generics.html

基本上使用LINQ来搜索所有Transform方法的集合,你无法回归本机所需的那个。

我认为GetMethod()调用中类型数组中的第二种类型令人困惑。 如果您获得包含这些方法的类的Type类的实例,那么它不包括用于创建该类实例的实际generics参数(它看起来像是Type ,基于您的第二个代码示例)。 相反,它只知道它有一个通用参数。

我目前没有编译器,所以很遗憾我不能尝试这个,但我会尝试为第二个参数指定typeof(List)的等价物(你可能会得到)这可以通过调用System.Collections.Generic.List.GetType() ,但我不是肯定的。

如果这不起作用,我能想到的唯一其他选项是调用Type.GetMethods(BindingFlags.Static | BindingFlags.Public) ,并自己搜索数组。