首页 > 后端开发 > C++ > 如何使用反射可靠地选择正确的泛型方法重载?

如何使用反射可靠地选择正确的泛型方法重载?

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

How to Reliably Select the Correct Generic Method Overload Using Reflection?

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

背景

反射允许开发者访问类型信息并动态调用方法。然而,在选择泛型方法时,区分重载可能具有挑战性。例如,System.Linq.Queryable 类包含多个 Where 方法的定义,使得选择所需版本变得困难。

基于参数类型选择正确的方法

为了解决这个问题,可以使用一种编译安全的方案:

1. 创建与所需重载匹配的委托或表达式

构造一个具有正确数量和类型的泛型和方法参数的委托或表达式,这些参数与目标重载相对应。例如:

<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>
登录后复制

2. 获取泛型 MethodInfo

从委托或表达式中提取 MethodInfo,并使用 GetGenericMethodDefinition 获取泛型方法定义。

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
登录后复制

3. 指定泛型类型参数

将实际的泛型类型参数传递给 MakeGenericMethod 来实例化特定的泛型方法。

<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
登录后复制

使用 Queryable.Where 重载的示例

对于具有重载的 Queryable.Where 方法:

<code class="language-csharp">public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, bool>>)

public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, int, bool>>)</code>
登录后复制

以下代码演示如何选择第一个版本:

<code class="language-csharp">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);</code>
登录后复制

解耦 MethodInfo 和参数类型

为了提高灵活性,可以分别获取 MethodInfo,并在稍后指定泛型类型参数。当在检索方法时未知类型时,这很有用。

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
登录后复制

通过遵循这些步骤,即使存在多个重载,开发者也可以通过反射以编译安全且灵活的方式选择正确泛型方法。

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

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