如何通过扩展重载泛型方法的反射来获取方法
本文关键字:反射 获取 方法 泛型方法 何通过 扩展 重载 | 更新日期: 2023-09-27 18:28:25
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));
}
例如,如何通过反射优先方法?
如果参数不是泛型类型,则可以使用 this overload of GetMethod
并传递类型数组以匹配参数类型。在这种情况下,我会使用 linq 来做到这一点:
yourType.GetMethods(BindingFlags.Static | BindingFlags.Public)
.FirstOrDefault(m => m.Name == "MustNotEqual" &&
m.GetParameters().Length == 2);
当然,您可以改进它以匹配参数类型,这只是一个例子。要了解为什么GetMethod
不是一个选项,您可以查看此问题。
查找适用于类的扩展方法非常棘手。当您调用扩展方法时,编译器将查看作用域中的所有类型,这些类型具有带有 ExtensionAttribute 的方法。编译器在编译扩展方法时会自动添加此扩展。
尝试在运行时解决它们很困难,因为当您的代码执行时,没有关于哪些命名空间在范围内的概念 - 您所拥有的只是您的类,它不一定与扩展方法相关联。如果你想在一个特定的类中搜索一个扩展方法,那么这很容易,你只需使用带有适当BindingFlags
的GetMethod
,如果你想真正彻底地检查Extension
属性。但是,如果不是这种情况,则需要枚举当前加载的所有程序集,以搜索具有具有与参数条件匹配的 Extension
属性的静态方法的公共类。