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));
}
如何通过反射第一种方法为例?
答案 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}}属性的静态方法的公共类。