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

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

Barbara Streisand
發布: 2025-01-11 13:42:43
原創
304 人瀏覽過

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

使用反射選擇正確的泛型方法

背景

反射允許開發者存取類型資訊並動態呼叫方法。然而,在選擇泛型方法時,區分重載可能具有挑戰性。例如,System.Linq.Queryable 類別包含多個 Where 方法的定義,使得選擇所需版本變得困難。

基於參數類型選擇正確的方法

為了解決這個問題,可以用編譯安全的方案:

1. 建立與所需重載相符的委託或表達式

建構一個具有正確數量和類型的泛型和方法參數的委託或表達式,這些參數與目標重載相對應。例如:

var method = new Action<object>(MyClass.DoSomething<object>);
登入後複製

2. 取得泛型 MethodInfo

從委託或表達式中提取 MethodInfo,並使用 GetGenericMethodDefinition 取得泛型方法定義。

var methodInfo = method.Method.GetGenericMethodDefinition();
登入後複製

3. 指定泛型型別參數

將實際的泛型類型參數傳遞給 MakeGenericMethod 來實例化特定的泛型方法。

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
登入後複製

使用 Queryable.Where 重載的範例

對於有重載的 Queryable.Where 方法:

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>>)
登入後複製

以下程式碼示範如何選擇第一個版本:

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

var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);
登入後複製

解耦 MethodInfo 和參數型別

為了提高靈活性,可以分別取得 MethodInfo,並在稍後指定泛型類型參數。當在檢索方法時未知類型時,這很有用。

var methodInfo = method.Method.GetGenericMethodDefinition();

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
登入後複製

透過遵循這些步驟,即使存在多個重載,開發者也可以透過反射以編譯安全且靈活的方式選擇正確泛型方法。

以上是如何使用反射可靠地選擇正確的泛型方法重載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板