ジェネリック型パラメーターと引数型の数が異なる2つのジェネリックメソッドオーバーロードがあります
// Argument types
public class Bar<T> {}
public class Bar<T, U> {}
// Generic method overloads
private static void Foo<T> (Bar<T> b) {}
private static void Foo<T, U> (Bar<T, U> b) {}
適切な数の型パラメーターを使用することで、どちらのメソッド情報も取得できると思います。
BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Static;
// Should give Foo<int>
GetType ().GetMethod ("Foo", Flags).MakeGenericMethod (typeof(int));
// Should give Foo<int, int>
GetType ().GetMethod ("Foo", Flags | BindingFlags.Static).MakeGenericMethod (typeof(int), typeof(int));
ただし、これはSystem.Reflection.AmbiguousMatchExceptionで失敗します。
いくつかのオーバーロードの引数new Type[] {typeof (Bar<,>)}
としてなどを指定しようとしましたが、結果は常にnullでした。関数に異なる名前を使用するだけであいまいさを回避できることはわかっていますが、これに対する実際の解決策があるかどうかを知りたいと思っています。types
GetMethod
.NET Standard 2.0、.NET Core2.0を使用しています
あなたが使用しない場合Type.GetMethods
は、使用できる結果の上に及び反復これのオーバーロードをGetMethod
し、Type.MakeGenericMethodParameter
.NETのコア2.1から提供されています:
class MyClass
{
// Argument types
public class Bar<T> { }
public class Bar<T, U> { }
// Generic method overrides
private static void Foo<T>(Bar<T> b) { }
private static void Foo<T, U>(Bar<T, U> b) { }
}
typeof(MyClass)
.GetMethod(
"Foo",
1,
BindingFlags.NonPublic | BindingFlags.Static,
null,
new[] { Type.MakeGenericSignatureType(typeof(MyClass.Bar<>), Type.MakeGenericMethodParameter(0)) },
null
); // First Foo
typeof(MyClass)
.GetMethod(
"Foo",
2,
BindingFlags.NonPublic | BindingFlags.Static,
null,
new[] { Type.MakeGenericSignatureType(typeof(MyClass.Bar<,>), Type.MakeGenericMethodParameter(0),Type.MakeGenericMethodParameter(1)) },
null
); // Second Foo
UPD
Type.MakeGenericMethodParameter
利用できないので、私が見る唯一のオプション(すべてのメソッドが同じジェネリック型argumetnsを持つジェネリッククラスの一部ではない場合)はGetMethods
、結果を使用してフィルタリングすることです。この場合の最も単純なフィルターは、ジェネリックパラメーターの数です。
var secondMethod = typeof(MyClass).GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
.Where(mi => mi.Name == "Foo" && mi.GetGenericArguments().Length == 2)
.First();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加