我需要使用反射来调用重载方法。 我的课程如下:
public static Transformer
{
//Overloaded method with generics parameter. First Transform Method
public static TranformerResult Transform<T>(object [] entities,
List<T> 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<T> GetTypes<T>() where T:class
{
}
}
我尝试使用以下语法调用第一个Transform方法:
GetMethod(“Transform”,(BindingFlags.Static | BindingFlags.Public),
null, new Type[](){typeof(object[]),typeof(List<Type>}, null)
但我得到第二种变换方法。
我的目的是在transformerResult上调用GetType。 transformerResult是一个返回第一个转换方法调用的对象。
任何人都可以帮我编写C#代码来实现我的意图吗?
谢谢, 的Mahir
答案 0 :(得分:3)
您遇到问题的原因是您要查找的特定方法是通用的。该方法的一种类型基于该方法的通用参数。这将为您提供一些问题22.泛型参数与方法相关联,因此在您拥有方法本身之前,无法正确构造方法的类型数组。
针对此特定方案的一个解决方案是抓住第一个通用方法。
var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First();
答案 1 :(得分:1)
除非这样做有效:typeof(List<>)
你需要对你所做的事情有点棘手,类似于我对这篇文章所做的事情:http://www.aaron-powell.com/posts/2010-04-08-reflection-and-generics.html
基本上使用LINQ来搜索所有Transform
方法的集合,你不能只回到你想要的本地方法。
答案 2 :(得分:0)
我认为调用GetMethod()
时类型数组中的第二种类型令人困惑。如果您获得包含这些方法的类的Type
类的实例,则不包括用于创建该类实例的实际泛型参数(它看起来像Type
,基于你的第二个代码示例)。相反,它只知道它有一个通用参数。
我目前没有编译器,所以不幸的是我不能尝试这个,但我会尝试为第二个参数指定等效的typeof(List<T>)
(你可能能够通过致电System.Collections.Generic.List.GetType()
得到这个,但我不是肯定的。)
如果这不起作用,我能想到的唯一其他选择是调用Type.GetMethods(BindingFlags.Static | BindingFlags.Public)
,并自己搜索数组。