在对象上调用通用扩展方法?

时间:2009-06-26 06:08:18

标签: generics reflection c#-3.0 extension-methods

我为DataRow对象创建了一个通用扩展方法。该方法不需要参数。我想通过Reflection使用MethodInfo调用Generic方法。我可以为Normarl公共方法做到这一点,但不知怎的,我无法获得Generic Extension方法的参考。

我在SO上阅读了this question,其中有些与我的查询相关,但没有运气。

1 个答案:

答案 0 :(得分:11)

请记住,扩展方法是编译器技巧。如果在定义了扩展方法的静态类中查找静态方法,则可以调用它。

现在,如果您拥有的只是一个对象并且您正在尝试查找特定扩展方法,则可以通过在应用程序域中搜索所有静态类来查找有问题的扩展方法有System.Runtime.CompilerServices.ExtensionAttribute以及有问题的特定方法名称和参数序列。

如果两个扩展类定义了具有相同名称和签名的扩展方法,则该方法将失败。如果程序集未在应用程序域中加载,它也将失败。

简单的方法就是这样(假设您正在寻找通用方法):

static class Extensions {
    public static T Echo<T>(this T obj) {
        return obj;
    }
}

class Program {

    static void Main(string[] args) {

        Console.WriteLine("hello".Echo());

        var mi = typeof(Extensions).GetMethod("Echo");
        var generic = mi.MakeGenericMethod(typeof(string));
        Console.WriteLine(generic.Invoke(null, new object[] { "hello" }));

        Console.ReadKey();
    }
}