c# – 动态创建基类的类型和调用构造函数
发布时间:2020-12-15 06:26:13 所属栏目:百科 来源:网络整理
导读:我需要动态创建一个类.大多数事情工作正常,但我被困在生成构造函数中. AssemblyBuilder _assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyBuilder"),AssemblyBuilderAccess.Run);ModuleBuilder _moduleBuilder = _ass
我需要动态创建一个类.大多数事情工作正常,但我被困在生成构造函数中.
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.我究竟做错了什么? 按照要求: BaseClass看起来像这样: public abstract class GenericType<GT,TEventSource,TEventArgs> : BaseClass where GT: GenericType<GT,TEventArgs>,new() where TEventArgs : EventArgs where TEventSource : class { protected GenericType(string eventName) { _eventName = eventName; } // ... } 我希望在运行时有一个结果: public class MyType : BaseClass<MyType,ConcreteSourceType,ConcreteEventArgsType> { protected MyType() : base("SomeName") { } } 解决方法
我认为问题是你试图调用通用类型GenericType>,TEventArgs>的构造函数,但你需要调用封闭类型BaseClass< MyType,ConcreteEventArgsType>的构造函数.解决方案似乎很简单:
var baseCtor = baseType.GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance,null); 问题是这不工作并抛出NotSupportedException.所以,似乎得到一个泛型类型的构造函数,其中一个参数是一个TypeBuilder是支持的. 因为这样,我认为你想要的是不可能使用Reflection.Emit,除非有一些黑客可以解决这个问题. 编辑:A-HA!我不得不深入Reflection.Emit in Reflector(虽然看文档中正确的地方也可以工作),但是我发现:有一个特殊的方法是这样的:the static var baseNonGenericCtor = baseNotGenericType.GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance,null); var baseCtor = TypeBuilder.GetConstructor(baseType,baseNonGenericCtor); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- ruby-on-rails – Rails ActiveRecord和基本类型
- ruby-on-rails – 如何使用Dockerfile文件运行bu
- 【cocos2dx宏定义 CC_SYNTHESIZE、CREATE_FUNC、
- c# – MonoDevelop解决方案文件和Visual Studio解
- C#:运行shell命令时出现问题
- JAXB完成XML与Java对象的互转
- could not get batchedbridge, make sure your b
- oracle – PL / SQL Developer的可折叠区域
- c – 原型声明和前向声明之间的区别?
- 解决github.com 打不开问题
热点阅读