.NET では、複数のジェネリック メソッドのオーバーロードがある場合、リフレクションを使用して正しいバージョンを選択するのが困難な場合があります。たとえば、System.Linq.Queryable
クラスの静的メソッドには、Where
メソッドの 2 つの定義があります。
<code class="language-c#">static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate) static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)</code>メソッドは、これらのオーバーロードを区別できないため、このタスクには十分ではありません。
GetMethod
解決策: パラメーター化されたデリゲートを使用する
デリゲートを作成することで、コンパイル時にメソッドを選択できます。
Action
Func
例 1:
メソッドを選択します:
Where
<code class="language-c#">var method = new Action<object>(MyClass.DoSomething<object>);</code>2 つのジェネリック型と 2 つのパラメーターを取る
メソッドの選択:
Where
このアプローチにより、危険な文字列検索やランタイム検索に頼ることなく、必要なメソッドを取得できます。
<code class="language-c#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>MethodInfo オブジェクトを取得
MethodInfo
静的拡張メソッド
<code class="language-c#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>静的拡張メソッドにはもう少し複雑なアプローチが必要ですが、同じ原則が適用されます。
MethodInfo とパラメーター タイプの分離
<code class="language-c#">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>); var methodInfo = method.Method.MakeGenericMethod(modelType);</code>場合によっては、
MethodInfo
この手法を使用すると、クラスからインスタンス メソッドを選択し、それらをさまざまな型で使用できるように公開するなど、複雑な操作を実行できます。
<code class="language-c#">var methodInfo = method.Method.GetGenericMethodDefinition(); methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });</code>結論
パラメーター化されたデリゲートを使用することで、
以上がリフレクションを使用して .NET で正しいオーバーロードされたジェネリック メソッドを選択する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。