c# dynamic reflection reflection.emit

c# - Creación dinámica de tipos con un constructor que hace referencia a sus dependencias



dynamic reflection (1)

Tengo las siguientes clases:

public class Entity<T> where T : Entity<T> { public Factory<T> Factory { get; private set; } public Entity(Factory<T> factory) { Factory = factory; } } public class Factory<T> { } public class MyEntity : Entity<MyEntity> { public MyEntity(Factory<MyEntity> factory) : base(factory) { } }

Estoy intentando crear dinámicamente la clase MyEntity con el constructor especificado. Hasta ahora tengo el siguiente código:

class Program { static ModuleBuilder _moduleBuilder; public static ModuleBuilder ModuleBuilder { get { if (_moduleBuilder == null) { AssemblyBuilder asmBuilder = System.Threading.Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("Dynamic"), AssemblyBuilderAccess.Run); _moduleBuilder = asmBuilder.DefineDynamicModule("MainModule"); } return _moduleBuilder; } } static void Main(string[] args) { TypeBuilder typeBuilder = ModuleBuilder.DefineType("MyEntity", TypeAttributes.Public); Type baseType = typeof(Entity<>).MakeGenericType(typeBuilder); typeBuilder.SetParent(baseType); Type factoryType = typeof(Factory<>).MakeGenericType(typeBuilder); ConstructorBuilder cBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { factoryType }); ILGenerator ctorIL = cBuilder.GetILGenerator(); ctorIL.Emit(OpCodes.Ldarg_0); ctorIL.Emit(OpCodes.Ldarg_1); ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType }); ctorIL.Emit(OpCodes.Call, c); ctorIL.Emit(OpCodes.Ret); Type syType = typeBuilder.CreateType(); Console.ReadLine(); } }

El código falló @ ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType }) . Obtuve una NotSupportedException.

¿Hay alguna forma de lograr esto? Me he visto obstaculizado por esto durante tres días. Cualquier ayuda sería apreciada.

¡Gracias!


TypeBuilder.GetConstructor usar el método estático TypeBuilder.GetConstructor . Creo que esto debería funcionar (no probado):

ConstructorInfo genCtor = typeof(Entity<>).GetConstructor(new Type[] { typeof(Factory<>).MakeGenericType(typeof(Entity<>).GetGenericArguments()) }); ConstructorInfo c = TypeBuilder.GetConstructor(baseType, genCtor);