反射允许开发者访问类型信息并动态调用方法。然而,在选择泛型方法时,区分重载可能具有挑战性。例如,System.Linq.Queryable
类包含多个 Where
方法的定义,使得选择所需版本变得困难。
为了解决这个问题,可以使用一种编译安全的方案:
构造一个具有正确数量和类型的泛型和方法参数的委托或表达式,这些参数与目标重载相对应。例如:
<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>
从委托或表达式中提取 MethodInfo
,并使用 GetGenericMethodDefinition
获取泛型方法定义。
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
将实际的泛型类型参数传递给 MakeGenericMethod
来实例化特定的泛型方法。
<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
对于具有重载的 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
,并在稍后指定泛型类型参数。当在检索方法时未知类型时,这很有用。
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition(); var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
通过遵循这些步骤,即使存在多个重载,开发者也可以通过反射以编译安全且灵活的方式选择正确泛型方法。
以上是如何使用反射可靠地选择正确的泛型方法重载?的详细内容。更多信息请关注PHP中文网其他相关文章!