Reflection.Emit
タイプ管理でさらに厄介な瞬間があります。
MyType
たとえば、動的に生成されたアセンブリで定義されているという名前のタイプがあります。MyType.GetMethods()
結果を呼び出すとNotSupportedException
、が発生します。これにより、独自のラッパーとルックアップテーブルのセットを作成する必要がなくなりました。GetMethods()
ただし、自分の型を汎用引数として使用する標準の汎用型でメソッドを呼び出したり、他の内省的なメソッドを呼び出したりする場合も、同じことが起こります。
Tuple<int, string>
=>正常に動作しますTuple<int, MyType>
=>例外
ジェネリック型の定義からメソッドリストを取得できます。
typeof(Tuple<int, MyType).GetGenericTypeDefinition().GetMethods()
ただし、メソッドには実際の値(など)ではなく一般的なプレースホルダーがT1
ありTResult
、一般的な引数を元の値にさかのぼる別のクラッジを書く気はありません。
コードのサンプル:
var asmName = new AssemblyName("Test");
var access = AssemblyBuilderAccess.Run;
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, access);
var module = asm.DefineDynamicModule("Test");
var aType = module.DefineType("A");
var tupleType = typeof(Tuple<,>);
var tuple = tupleType.MakeGenericType(new [] { typeof(int), aType });
tuple.GetProperty("Item1"); // <-- here's the error
したがって、質問は次のとおりです。
- タイプが安全に呼び出せる
GetMethods()
かどうか、および同様のメソッドを検出するにはどうすればよいですか? - タイプが安全でない場合、メソッドの実際のリストとその汎用引数値を取得するにはどうすればよいですか?