リフレクションを使用すると、開発者は型情報にアクセスし、メソッドを動的に呼び出すことができます。ただし、汎用メソッドを選択する場合、オーバーロードを区別するのが困難になる場合があります。たとえば、System.Linq.Queryable
クラスには複数の Where
メソッドの定義が含まれているため、必要なバージョンを選択することが困難になります。
この問題を解決するには、コンパイルセーフなソリューションを使用できます。
ターゲットのオーバーロードに対応するジェネリック パラメーターとメソッド パラメーターの正しい数と型を使用して、デリゲートまたは式を構築します。例:
var method = new Action<object>(MyClass.DoSomething<object>);
デリゲートまたは式から MethodInfo
を抽出し、GetGenericMethodDefinition
を使用してジェネリック メソッド定義を取得します。
var methodInfo = method.Method.GetGenericMethodDefinition();
実際のジェネリック型パラメータを MakeGenericMethod
に渡して、特定のジェネリック メソッドをインスタンス化します。
var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
オーバーロードのある 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
を個別に取得し、後からジェネリック型パラメーターを指定できます。これは、メソッドを取得するときに型が不明な場合に便利です。
var methodInfo = method.Method.GetGenericMethodDefinition(); var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
これらの手順に従うことで、開発者は、複数のオーバーロードが存在する場合でも、コンパイルセーフかつ柔軟な方法でリフレクションを通じて正しいジェネリック メソッドを選択できます。
以上がリフレクションを使用して正しいジェネリック メソッド オーバーロードを確実に選択する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。