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

リフレクションを使用して .NET で正しいオーバーロードされたジェネリック メソッドを選択する方法

Barbara Streisand
リリース: 2025-01-11 13:31:42
オリジナル
581 人が閲覧しました

How to Select the Correct Overloaded Generic Method in .NET Using Reflection?

リフレクションを使用して、正しい汎用メソッドを選択します

課題: オーバーロードされたジェネリック メソッドを特定する

.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解決策: パラメーター化されたデリゲートを使用する

適切な汎用メソッドを選択するために、パラメーター化されたデリゲートを作成する手法を採用できます。目的のオーバーロードのジェネリック数とパラメーター数に一致する

または

デリゲートを作成することで、コンパイル時にメソッドを選択できます。 ActionFunc例 1:

ジェネリック型と 1 つのパラメーターを取る

メソッドを選択します: Where

例 2:
<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート