2012-04-09 8 views
9

Ich habe die folgenden Klassen verweisen:Dynamisch Creation mit einem Konstruktor, der seine Abhängigkeiten

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) { } 
} 

Ich versuche, dynamisch angegeben Klasse MyEntity mit dem Konstruktor zu erstellen. Bisher habe ich den folgenden Code:

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

Der Code ist fehlgeschlagen @ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType }). Ich habe eine NotSupportedException erhalten.

Gibt es eine Möglichkeit, dies zu erreichen? Ich habe drei Tage lang damit zu tun gehabt. Jede Hilfe wäre willkommen.

Danke!

+1

Aufruf Eric Lippert, Eric Lippert? – Joe

+2

@JoeTuskan: Ich glaube nicht, dass ich hier gebraucht werde; Das ist eine direkte Frage zu Reflection. –

Antwort

3

Sie müssen die statische Methode TypeBuilder.GetConstructor verwenden. Ich denke, das sollte funktionieren (ungetestet):

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