使用反射调用泛型重载方法

时间:2009-03-08 13:01:49

标签: c# reflection

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

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

3 个答案:

答案 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),并自己搜索数组。