ホームページ >バックエンド開発 >C++ >リフレクションを使用して正しいジェネリック メソッド オーバーロードを確実に選択する方法

リフレクションを使用して正しいジェネリック メソッド オーバーロードを確実に選択する方法

Barbara Streisand
Barbara Streisandオリジナル
2025-01-11 13:42:43285ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。