2012-04-09 1 views
9

У меня есть следующие классы:Динамическое создание Тип с застройщиком, которые ссылаются его зависимости

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

Я пытаюсь динамически создать класс MyEntity с конструктором указанного. До сих пор у меня есть следующий код:

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

код не удалось @ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType }). Я получил исключение NotSupportedException.

Есть ли способ достичь этого? Я был ошеломлен этим в течение трех дней. Любая помощь будет оценена по достоинству.

Спасибо!

+1

Звонок Эрика Липперта, Эрика Липперта? – Joe

+2

@JoeTuskan: Я не думаю, что я здесь нужен; это простой вопрос о отражении. –

ответ

3

Вам необходимо использовать статический метод TypeBuilder.GetConstructor. Я думаю, что это должно работать (непроверено):

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