I'm having yet another nasty moment with Reflection.Emit
and type management.
Say, I have a type named MyType
which is defined in the dynamically generated assembly.
Calling MyType.GetMethods()
results in a NotSupportedException
, which has reduced me to writing my own set of wrappers and lookup tables. However, the same is happening when I'm calling GetMethods()
or any other introspecting methods on standard generic types which use my own types as generic arguments:
Tuple<int, string>
=> works fineTuple<int, MyType>
=> exceptionI can get the method list from the generic type definition:
typeof(Tuple<int, MyType).GetGenericTypeDefinition().GetMethods()
However, the methods have generic placeholders instead of actual values (like T1
, TResult
etc.) and I don't feel like writing yet another kludge that traces the generic arguments back to their original values.
A sample of code:
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
So the questions are:
GetMethods()
and similar methods on?I got an answer in a follow-up question. The TypeBuilder
class has a bunch of static overloads which do exactly the thing:
var genericTuple = typeof(Tuple<,>);
var myTuple = genericTuple.MakeGenericType(typeof(int), myType);
var ctor = TypeBuilder.GetConstructor(myTuple, genericTuple.GetConstructors().First());
Strangely, there's no overload of GetProperty
. However, property getters and setters can still be resolved using GetMethod
:
var genericGetter = typeof(Tuple<,>).GetProperty("Item1").GetMethod;
var actual = TypeBuilder.GetMethod(myTuple, genericGetter);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With