如何通过反射扩展重载泛型方法来获取方法?

时间:2014-10-29 09:55:50

标签: c# .net reflection

public static M MustNotEqual<M, T, R>(this IMustPassRule<M, T, R> mpr, R value)
{
    return mpr.MustPassRule(new NotEqualRule<R>(value));
}

public static M MustNotEqual<M, T, R>(this IMustPassRule<M, T, R> mpr, R value, IEqualityComparer<R> comparer)
{
    return mpr.MustPassRule(new NotEqualRule<R>(value, comparer));
}

如何通过反射第一种方法为例?

2 个答案:

答案 0 :(得分:0)

如果参数不是泛型类型,您可以使用this overload of GetMethod并传递一个类型数组来匹配参数类型。在这种情况下,我会使用linq:

yourType.GetMethods(BindingFlags.Static | BindingFlags.Public)
        .FirstOrDefault(m => m.Name == "MustNotEqual" &&
                             m.GetParameters().Length == 2);

当然,您可以改进此选项以匹配参数类型,这只是一个示例。要了解为什么GetMethod不是一个选项,您可以查看this question

答案 1 :(得分:0)

查找适用于类的扩展方法非常棘手。当您调用扩展方法时,编译器将查看范围内具有ExtensionAttribute方法的所有类型。编译器在编译扩展方法时会自动添加此扩展名。

尝试在运行时解决它们很困难,因为在代码执行时没有关于命名空间的概念 - 您所拥有的只是您的类,并且它不一定与扩展方法相关联。如果您想在特定类中搜索扩展方法,那么这很简单,您只需将GetMethod与相应的BindingFlags一起使用,如果您想成为Extension,请检查Extension属性非常彻底。但是,如果不是这种情况,则您需要枚举当前加载的所有程序集,以搜索具有与您的参数条件匹配的{{1}}属性的静态方法的公共类。