के प्रकार और कॉल कन्स्ट्रक्टर बनाएं गतिशील रूप से कक्षा बनाने की आवश्यकता है। ज्यादातर चीजें ठीक काम करती हैं लेकिन मैं कन्स्ट्रक्टर उत्पन्न करने में फंस गया हूं।गतिशील रूप से बेस-क्लास
AssemblyBuilder _assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyBuilder"), AssemblyBuilderAccess.Run);
ModuleBuilder _moduleBuilder = _assemblyBuilder.DefineDynamicModule("MyModule");
public static object GetInstance<TSource, TEventArgs>(this TSource source, string eventName)
where TSource : class
{
var typeName = "MyTypeName";
var typeBuilder = _moduleBuilder.DefineType(typeName, TypeAttributes.Class | TypeAttributes.Public);
// create type like class MyClass : GenericType<MyClass, TSource, TEventArgs>
var baseNotGenericType = typeof(GenericType<,,>);
var baseType = baseNotGenericType.MakeGenericType(typeBuilder, typeof(TSource), typeof(TEventArgs));
typeBuilder.SetParent(baseType);
// the base class contains one constructor with string as param
var baseCtor = baseNotGenericType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(string) }, null);
var ctor = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard | CallingConventions.HasThis, new Type[0]);
var ilGenerator = ctor.GetILGenerator();
// i want to call the constructor of the baseclass with eventName as param
ilGenerator.Emit(OpCodes.Ldarg_0); // push "this"
ilGenerator.Emit(OpCodes.Ldstr, eventName); // push the param
ilGenerator.Emit(OpCodes.Call, baseCtor);
ilGenerator.Emit(OpCodes.Ret);
var type = typeBuilder.CreateType();
// return ...
}
कन्स्ट्रक्टर के कॉल पर मुझे BadImageFormatException मिल रहा है। मैं क्या गलत कर रहा हूं?
अनुरोध किया के रूप में: क्रम में एक परिणाम के रूप
public abstract class GenericType<GT, TEventSource, TEventArgs> : BaseClass
where GT: GenericType<GT, TEventSource, TEventArgs>, new()
where TEventArgs : EventArgs
where TEventSource : class
{
protected GenericType(string eventName)
{
_eventName = eventName;
}
// ...
}
मैं चाहते हैं क्या है करने के लिए:
BaseClass कुछ इस तरह दिखता
public class MyType : BaseClass<MyType, ConcreteSourceType, ConcreteEventArgsType>
{
protected MyType() : base("SomeName")
{
}
}
एक नज़र के रूप में अच्छा है यहां http://stackoverflow.com/questions/893423/how-do-create-a-dynamic-class-in-c-sharp-4 –
वास्तव में सहायक नहीं है या क्या मुझे कुछ याद आया? मैं बेसक्लास से उत्तराधिकारी बनना चाहता हूं और इसे मूल आधार निर्माता कहता हूं जिसमें तर्क है। – SACO
इस लिंक को भी आजमाएं http://blogs.msdn.com/b/cburrows/archive/2009/04/22/dynamic-base-classes-in-c-4.aspx –