リフレクションを使用して汎用メソッドを選択します
リフレクションを使用すると、特定のジェネリック型パラメーターを使用してメソッドを呼び出すことができますが、複数のジェネリック オーバーロードが存在する場合、適切なメソッドを選択するのが困難になることがあります。この記事では、デリゲートとメソッド情報オブジェクトを操作してターゲットのジェネリック メソッドを正確に選択するコンパイル時のアプローチを示します。
代理選択メソッドを使用する
静的メソッドの場合、必要な数のジェネリックスとパラメーターを含むデリゲートを作成すると、特定のオーバーロードを選択できるようになります。たとえば、DoSomething<TModel>
の最初のオーバーロードを選択するには、汎用パラメーターが 1 つだけあります:
var method = new Action<object>(MyClass.DoSomething<object>);
または 2 番目のオーバーロード。これには 2 つの汎用パラメーターがあります:
var method = new Action<object, object>(MyClass.DoSomething<object, object>);
静的拡張メソッドの場合は、同様のパターンに従い、適切な型を使用して this
パラメーターを処理します。
var method = new Func<IQueryable<object>, Expression<Func<bool>>, IQueryable<object>>(Queryable.Where<object>);
メソッド情報の取得
デリゲートの プロパティは、基礎となる Method
オブジェクトを提供します。汎用メソッド定義を取得し、特定の型パラメーターを指定するには: MethodInfo
var methodInfo = method.Method.MakeGenericMethod(type1, type2);
インスタンスメソッド
インスタンス メソッドを選択するプロセスは次のようになります。
var method = new Action<object>(instance.MyMethod<object>); var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(type1);
デカップリング方法の選択とパラメーターの種類
ジェネリック型パラメーターが後で決定されない場合:
var methodInfo = method.Method.GetGenericMethodDefinition();
に渡します: MakeGenericMethod()
methodInfo.MakeGenericMethod(type1, type2);
結論
このアプローチにより、コンパイル時にジェネリック メソッドを正確に選択できるようになり、エラーが発生しやすいランタイム検索や文字列の使用が回避されます。これは、さまざまな型パラメーターを使用してジェネリック メソッドを呼び出すための堅牢かつ柔軟なメカニズムを提供します。以上がコンパイル時にリフレクションを使用してジェネリック メソッドを正確に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。