リフレクションを介して適切なジェネリック メソッドを選択することは、特にメソッドのジェネリック オーバーロードが複数ある場合に困難になることがあります。この記事では、文字列やランタイム検索に依存せずに、コンパイルセーフで効率的な正しい汎用メソッドを選択する方法を検討します。
MethodInfo.MakeGenericMethod
メソッドでラムダ式またはデリゲートを使用すると、コンパイル時に特定の汎用オーバーロードを選択できます。たとえば、次のような汎用メソッドがあるとします。
<code>public static void DoSomething<TModel>(TModel model)</code>
ジェネリック数と引数数に一致するデリゲートを作成できます:
<code>var method = new Action<object>(MyClass.DoSomething<object>);</code>
ジェネリック型を object
に置き換えることにより、ランタイム パイプや危険な文字列操作に頼ることなく、正しいオーバーロードを選択できます。
静的メソッド (System.Linq.Queryable
クラス内のメソッドなど) の場合も、同様のアプローチを使用できます。たとえば、IQueryable<TModel>
と Expression<Func<TModel, bool>>
を受け取る Where
メソッドを選択するには、次のようにします。
<code>var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);</code>インスタンスメソッド
を呼び出す前に、MakeGenericMethod
を使用して汎用の GetGenericMethodDefinition
を取得します。 MethodInfo
MethodInfo
を使用すると、ジェネリック型の割り当てから GetGenericMethodDefinition
の選択を切り離し、インスタンス化される型を認識し、その型でメソッドを呼び出す別のメソッドに MethodInfo
を渡すことができます。 MethodInfo
の複数のオーバーロードを持つクラスを考えてみましょう。次のコードは、上記の手法を使用して正しいオーバーロードを選択する方法を示しています。
CopyList
<code>var listTo = ReflectionHelper.GetIEnumerableType(fromValue.GetType()); var fn = new Func<IEnumerable<object>, Func<PropertyInfo, bool>, Dictionary<Type, Type>, IEnumerable<object>>(ModelTransform.CopyList<object>); var copyListMethod = fn.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(listTo); copyListMethod.Invoke(null, new object[] { fromValue, whereProps, typeMap });</code>
以上がリフレクションを使用して正しいジェネリック メソッド オーバーロードを安全に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。