2012-04-09 19 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 }): अब तक मैं निम्नलिखित कोड है। मुझे एक असमर्थित अपवाद मिला।

क्या यह हासिल करने का कोई तरीका है? मैं इसे तीन दिनों के लिए stonewalled किया गया है। किसी भी सहायता की सराहना की जाएगी।

धन्यवाद!

+1

एरिक लिपर्ट, एरिक लिपर्ट को कॉल करना? – Joe

+2

@ जोउत्स्कन: मुझे नहीं लगता कि मुझे यहां जरूरी है; यह प्रतिबिंब के बारे में एक सीधा सवाल है। –

उत्तर

3

आपको स्थिर TypeBuilder.GetConstructor विधि का उपयोग करने की आवश्यकता है। मुझे लगता है कि यह काम करना चाहिए (अवांछित):

ConstructorInfo genCtor = typeof(Entity<>).GetConstructor(new Type[] { typeof(Factory<>).MakeGenericType(typeof(Entity<>).GetGenericArguments()) }); 
ConstructorInfo c = TypeBuilder.GetConstructor(baseType, genCtor); 
संबंधित मुद्दे