首页 > 后端开发 > C++ > 如何使用反射在 .NET 中选择正确的重载通用方法?

如何使用反射在 .NET 中选择正确的重载通用方法?

Barbara Streisand
发布: 2025-01-11 13:31:42
原创
605 人浏览过

How to Select the Correct Overloaded Generic Method in .NET Using Reflection?

使用反射选择正确的泛型方法

挑战:识别重载泛型方法

在 .NET 中,当存在多个泛型方法重载时,尝试使用反射来选择正确的版本可能会带来挑战。例如,System.Linq.Queryable 类中的静态方法具有 Where 方法的两个定义:

static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
登录后复制

反射中的 GetMethod 方法不足以完成此任务,因为它无法区分这些重载。

解决方法:使用参数化委托

为了选择正确的泛型方法,我们可以采用一种涉及创建参数化委托的技术。通过创建一个与所需重载的泛型计数和参数计数匹配的 ActionFunc 委托,我们可以在编译时选择该方法:

示例 1: 选择采用一个泛型类型和单个参数的 Where 方法:

var method = new Action<object>(MyClass.DoSomething<object>);
登录后复制

示例 2: 选择采用两个泛型类型和两个参数的 Where 方法:

var method = new Action<object, object>(MyClass.DoSomething<object, object>);
登录后复制

这种方法允许我们获得所需的方法,而无需依赖于有风险的字符串或运行时搜索。

获取 MethodInfo 对象

如果您需要 MethodInfo 对象,则可以在创建委托后获取它:

var methodInfo = method.Method.MakeGenericMethod(type1, type2);
登录后复制

静态扩展方法

静态扩展方法需要稍微复杂一点的方法,但相同的原理适用:

var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.MakeGenericMethod(modelType);
登录后复制

解耦 MethodInfo 和参数类型

有时,可能需要解耦 MethodInfo 对象和参数类型:

var methodInfo = method.Method.GetGenericMethodDefinition();

methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
登录后复制

此技术使您可以执行复杂的操作,例如从类中选择实例方法并将其公开以用于不同类型。

结论

通过使用参数化委托,我们可以绕过 GetMethod 的限制,并在编译时选择正确的泛型方法。这种方法确保类型安全并避免不必要的动态查找。

以上是如何使用反射在 .NET 中选择正确的重载通用方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板