Tôi cần tạo một lớp động. Hầu hết mọi thứ hoạt động tốt nhưng tôi đang mắc kẹt trong việc tạo ra các nhà xây dựng.Tự động tạo kiểu và gọi hàm tạo của lớp cơ sở
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 ...
}
Khi gọi hàm tạo, tôi nhận được BadImageFormatException. Tôi đang làm gì sai?
Theo yêu cầu:
Các BaseClass trông giống như sau:
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;
}
// ...
}
gì tôi muốn có kết quả là trong thời gian chạy:
public class MyType : BaseClass<MyType, ConcreteSourceType, ConcreteEventArgsType>
{
protected MyType() : base("SomeName")
{
}
}
có một cái nhìn ở đây http://stackoverflow.com/questions/893423/how-do-create-a-dynamic-class-in-c-sharp-4 –
Không thực sự hữu ích hoặc đã làm tôi bỏ lỡ một cái gì đó? Tôi muốn kế thừa từ một baseclass và gọi nó là constructor cơ sở mà có một đối số. – SACO
Hãy thử liên kết này cũng http://blogs.msdn.com/b/cburrows/archive/2009/04/22/dynamic-base-classes-in-c-4.aspx –