使用Reflection.Emit创建一个实现接口的类我需要使用Reflection.Emit生成一个实现如下接口的类。公共接口IObject{TGet(字符串属性名);有没有人举例说明我将如何将以下内容作为一个简单的测试用例发布?classGeneratedObject:IObject{publicTGet(stringpropertyName){//这是最简单的实现returndefault(T);如果您正在使用Reflection.Emit,那么您应该真正获得Reflection.Emit语言为Reflector加载的项目的副本。虽然不完美,但它应该至少让您获得任何给定启动代码的95%。我手头没有编译器,但像这样的东西应该可以工作:varaName=newAssemblyName("temp");varappDomain=Threading.Thread.GetDomain();varaBuilder=appDomain.DefineDynamicAssembly(aName,AssemblyBuilderAccess.Run);varmBuilder=aBuilder.DefineDynamicModule(aName.Name);vartBuilder=mBuilder.DefineType("GeneratedObject",TypeAttributes.Public|TypeAttributes.Class);tBuilder.AddInterfaceImplementation(类型(IObject));varmethBuilder=tBuilder.DefineMethod("获取",MethodAttributes.Public|MethodAttributes.Final|MethodAttributes.Virtual);vartypeParam=mb.DefineGenericParameters(newstring[]{"T"})[0];methBuilder.SetParameters(newType[]{typeof(string)});methBuilder.SetReturnType(typeParam);varilg=methBuilder.GetILGenerator();让lBuilder=ilg.DeclareLocal(typeParam);ilg.Emit(OpCodes.Ldloca_S,(byte)0);ilg.Emit(OpCodes.Initobj,typeParam);ilg.Emit(OpCodes.Ldloc_0);ilg.Emit(OpCodes.Ret);vargeneratedType=tBuilder.CreateType();我相信AutoMapper和/或者LinFu会为你做你完全可以使用AutoMapper创建接口的实例,我已经做到了。你忘了返回BOX:internaldelegateobjectFastConstructorHandler(object[]paramters);privatestaticFastConstructorHandlerCreateDelegate(TypeTipo){DynamicMethoddynamicMethod=newDynamicMethod(string.Empty,typeof(object),newType[]{typeof(object[])},Tipo.Module,false);ILGeneratorilg=dynamicMethod.GetILGenerator();ilg.DeclareLocal(Tipo);ilg.Emit(OpCodes.Ldloca_S,(byte)0);ilg.Emit(OpCodes.Initobj,Tipo);ilg.Emit(OpCodes.Ldloc_0);ilg.Emit(OpCodes.Box,Tipo);ilg.Emit(OpCodes.Ret);返回(FastConstructorHandler)dynamicMethod.CreateDelegate(typeof(FastConstructorHandler));看起来,您想在运行时通过名称快速访问对象的属性,而无需反射。使用Yappi及其属性类,您可以像这样实现给定的接口:classGeneratedObject:IObject{publicstringValue{get{return"Test";}}publicTGet(stringpropertyName){returnProperty.Get(this,propertyName);然后像这样使用它:IObjectobj=newGeneratedObject();varvalue=obj.Get("值");//value包含“Test”还需要IObject和动态类型构造吗?以上就是C#学习教程:使用Reflection.Emit创建一个实现接口的类。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
