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

5

我创建了一个DataRow对象的通用扩展方法,该方法不需要参数。我想通过MethodInfo反射调用通用方法。我可以对普通公共方法执行此操作,但是无论如何都不能获取通用扩展方法的引用。

我已经阅读了关于stackoverflow上的这个问题,但是没有成功。


据我所知,扩展方法不会成为 DataRow 类的一部分。您可能需要查看您定义扩展方法的类,并查找 ExtensionMethodAttribute。 - shahkalpesh
这个应该是ExtensionAttribute(而不是ExtensionMethodAttribute)。对此我感到抱歉。 - shahkalpesh
@shahkalpesh:谢谢,我会试一试的。 - this. __curious_geek
1个回答

12
请记住,扩展方法是编译器的技巧。如果您在定义扩展方法的静态类上查找静态方法,则可以很好地调用它。
现在,如果您只有一个对象,并且正在尝试查找特定的扩展方法,您可以通过搜索应用程序域中所有静态类的方法来找到所需的扩展方法,这些方法具有 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();
    }
}

这是否意味着我需要从定义ExtensionMethod的类中获取MethoInfo引用,然后在运行时在托管ExtensionMethod的对象上调用它??? - this. __curious_geek
这是一个静态方法,因此您不需要在对象上调用它,该对象是该方法的第一个参数。 - Sam Saffron
这意味着,当我尝试获取引用时,它将抛出异常。 - this. __curious_geek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接