首頁 >後端開發 >C++ >如何使用反射可靠地選擇正確的泛型方法重載?

如何使用反射可靠地選擇正確的泛型方法重載?

Barbara Streisand
Barbara Streisand原創
2025-01-11 13:42:43288瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn