Reflection-generated and generic types

c#, reflection.emit

Solution

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);

Problem

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 fine - `Tuple<int, MyType>` => exception I 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: - How do I detect if a type is safe to call `GetMethods()` and similar methods on? - How do I get the actual list of methods and their generic argument values, if the type is not safe?

Original source