当前位置: 首页 > 编程语言 > C#

reflectionemission-howtobuildaconstructorforthis分享

时间:2023-04-10 12:10:24 C#

reflectionemission:howtobuildaconstructorforthis我要动态构建的代码如下:新的ObservableTestCollection(这个);}publicSample(IEnumerablesource){Items=newObservableTestCollection(this,source);}公共ObservableTestCollection项目;ObservableTestCollection的来源如下:publicclassObservableTestCollection:ObservableCollection{publicTParent;publicObservableTestCollection(T=parent){;}publicObservableTestCollection(Tparent,IEnumerablesource):base(source){Parent=parent;我写的代码是:conststringassemblyName="SampleAssembly";conststringfieldName="项目";conststringtypeName="样品";conststringassemblyFileName=assemblyName+".dll";AppDomain域=AppDomain.CurrentDomain;AssemblyBuilderassemblyBuilder=domain.DefineDynamicAssembly(newAssemblyName(assemblyName),AssemblyBuilderAccess.RunAndSave);ModuleBuildermoduleBuilder=程序集lder.DefineDynamicModule(assemblyName,assemblyFileName);TypeBuildertypeBuilder=moduleBuilder.DefineType(typeName,TypeAttributes.Class|TypeAttributes.Public);Type[]ctorParameters=newType[]{typeBuilder};输入typeOfCTS=typeof(ObservableTestCollection);输入genericTypeOTS=typeOfCTS.MakeGenericType(typeBuilder);FieldBuilderfieldBuilder=typeBuilder.DefineField(fieldName,genericTypeOTS,FieldAttributes.Public);//第一个构造函数ConstructorBuilderctorBuilder=typeBuilder.DefineConstructor(MethodAttributes.Public,CallingConventions.HasThis,Type.EmptyTypes);ILGenerator生成器=ctorBuilder.GetILGenerator();generator.Emit(OpCodes.Ldarg_0);//加载这个generator.Emit(OpCodes.Call,typeof(object).GetConstructor(Type.EmptyTypes));//调用对象构造函数varci=typeOfCTS.GetConstructors()[0];generator.Emit(OpCodes.Newobj,ci);generator.Emit(OpCodes.Stfld,fieldBuilder);//存储到Itemsgenerator.Emit(OpCodes.Ret);//返回//第二个构造函数vartypeOfIE=typeof(IEnumerable);vargenericTypeIE=typeOfIE.MakeGenericType(typeBuilder);ctorParameters=newType[]{genericTypeIE};ctorBuilder=typeBuilder.DefineConstructor(MethodAttributes.Public,CallingConventions.HasThis,ctorParameters);ctorParameters=newType[]{typeBuilder,genericTypeIE};generator=ctorBuilder.GetILGenerator();generator.Emit(OpCodes.Ldarg_0);//加载这个ci=typeOfCTS.GetConstructors()[1];发电机。发出(OpCodes.Newobj,ci);generator.Emit(OpCodes.Stfld,fieldBuilder);//存储到Itemsgenerator.Emit(OpCodes.Ret);//返回类型type=typeBuilder.CreateType();varobj=Activator.CreateInstance(type);assemblyBuilder.Save(assemblyFileName);我无法创建Sample的实例谁能帮我解决这个问题?感谢您的帮助。这个错误的原因是调用了开放泛型类型的构造函数。您需要使用TypeBuilder作为泛型参数来获取封闭泛型类型的构造函数。对于此解释,获取ConstructorInfo存在一些问题。所以解决方案是使用以下参数调用TypeBuilder.GetConstructor(Type,ConstructorInfo)静态方法(正如@TonyTHONG已经提到的):您可以在下面看到问题的代码示例:conststringassemblyName="SampleAssembly";conststringfieldName="项目";conststringtypeName="样品";conststringassemblyFileName=assemblyName+".dll";vardomain=AppDomain.CurrentDomain;varassemblyBuilder=domain.DefineDynamicAssembly(newAssemblyName(assemblyName),AssemblyBuilderAccess.RunAndSave);varmoduleBuilder=assemblyBuilder.DefineDynamicModule(assemblyName,assemblyFileName);vartypeBuilder=moduleBuilder.DefineType(typeName,TypeAttributes.Class|TypeAttributes.Public);vartypeOfCts=typeof(ObservableTestCollection);vargenericTypeOfCts=typeBuildfieldOfCts。=typeBuilder.DefineField(fieldName,genericTypeOfCts,FieldAttributes.Public);//第一个构造函数Sample()varctorBuilder=typeBuilder.DefineConstructor(MethodAttributes.Public,CallingConventions.HasTh是,Type.EmptyTypes);varobsCtor1=typeOfCts.GetConstructors().First(c=>c.GetParameters().Length==1);obsCtor1=TypeBuilder.GetConstructor(genericTypeOfCts,obsCtor1);//hack以typeBuilder作为泛型参数获取关闭泛型类型ctorvargenerator=ctorBuilder.GetILGenerator();generator.Emit(OpCodes.Ldarg_0);//为基类型构造器加载这个generator.Emit(OpCodes.Call,typeof(object).GetConstructors().Single());generator.Emit(OpCodes.Ldarg_0);//为字段设置器加载它generator.Emit(OpCodes.Ldarg_0);//为ObservableTestCollection构造函数加载这个generator.Emit(OpCodes.Newobj,obsCtor1);//调用ObservableTestCollection构造函数,它将指向堆栈中的新对象generator.Emit(OpCodes.Stfld,fieldBuilder);//存储到Itemsgenerator.Emit(OpCodes.Ret);//返回//第二个构造函数Sample(IEnumerablesource)varctorParam=typeof(IEnumerable).MakeGenericType(typeBuilder);ctorBuilder=类型生成器。DefineConstructor(MethodAttributes.Public,CallingConventions.HasThis,newType[]{ctorParam});obsCtor1=typeOfCts.GetConstructors().First(c=>c.GetParameters().Length==2);obsCtor1=TypeBuilder.GetConstructor(genericTypeOfCts,obsCtor1);//hack以typeBuilder作为泛型参数获得接近泛型类型的ctorgenerator=ctorBuilder.GetILGenerator();generator.Emit(OpCodes.Ldarg_0);//为基类型构造器加载这个generator.Emit(OpCodes.Call,typeof(object).GetConstructors().Single());generator.Emit(OpCodes.Ldarg_0);//为字段设置器加载它generator.Emit(OpCodes.Ldarg_0);//为ObservableTestCollection构造函数加载这个generator.Emit(OpCodes.Ldarg_1);//为ObservableTestCollection构造函数加载IEnumerablegenerator.Emit(OpCodes.Newobj,obsCtor1);//调用ObservableTestCollection构造函数,它将指向堆栈中的新对象generator.Emit(OpCodes.Stfld,fieldBuilder);//存储到Itemsgenerator.Emit(OpCodes.Ret);//返回vartype=typeBuilder.CreateType();varobj1=Activator.CreateInstance(类型);var参数=Activator.CreateInstance(typeof(List).MakeGenericType(type));varobj2=激活器。创建实例(类型,参数);assemblyBuilder.Save(assemblyFileName);还要记住,我只是通过将ObservableTestCollection放在与生成Sample类的代码不同的程序集中来设法让ObservableTestCollection工作,如果我没记错的话,你也会动态生成ObservableTestCollection类。因此它可以在不分离程序集的情况下工作,特别是如果您对它们使用相同的AssemblyBuilder时。您的程序无效,因为您尝试创建“示例的ObservableTestCollection”的实例,但示例是一个类型生成器。如果泛型参数是“MakeGenericType”以外的类型构建器,请使用TypeBuilder.GetConstructor(Type,ConstructorInfo)获取泛型构造函数。以上就是C#学习教程分享的全部内容:反射启动:如何为此构建一个构造函数。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: