2012-04-09 25 views
9

Tengo las siguientes clases:Creación Tipo Dinámico con un constructor que hacen referencia a sus dependencias

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 myEntity clase 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 fallidos @ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType }). Obtuve una NotSupportedException.

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

Gracias!

+1

Llamando a Eric Lippert, Eric Lippert? – Joe

+2

@JoeTuskan: No creo que me necesiten aquí; esta es una pregunta directa sobre Reflection. –

Respuesta

3

Debe utilizar 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); 
Cuestiones relacionadas