リフレクションを使用すると、開発者は型情報にアクセスし、メソッドを動的に呼び出すことができます。ただし、汎用メソッドを選択する場合、オーバーロードを区別するのが困難になる場合があります。たとえば、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 中国語 Web サイトの他の関連記事を参照してください。