反射允許開發者存取類型資訊並動態呼叫方法。然而,在選擇泛型方法時,區分重載可能具有挑戰性。例如,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中文網其他相關文章!