问题描述
usingSystem;usingSystem.Reflection;usingSystem.Reflection.Emit;publicinterfaceIAnimal{voidmove();voideat();}publicclassTypeCreator{privateTypetargetType;///<summary>///构造函数///</summary>///<paramname="targetType">被实现或者继承的类型</param>publicTypeCreator(TypetargetType){this.targetType=targetType;}publicTypebuild(){//获取当前AppDomainAppDomaincurrentAppDomain=AppDomain.CurrentDomain;//System.Reflection.AssemblyName是用来表示一个Assembly的完整名称的AssemblyNameassyName=newAssemblyName();//为要创建的Assembly定义一个名称(这里忽略版本号,Culture等信息)assyName.Name="MyAssyFor_"+targetType.Name;//获取AssemblyBuilder//AssemblyBuilderAccess有Run,Save,RunAndSave三个取值AssemblyBuilderassyBuilder=currentAppDomain.DefineDynamicAssembly(assyName,AssemblyBuilderAccess.Run);//获取ModuleBuilder,提供String参数作为Module名称,随便设一个ModuleBuildermodBuilder=assyBuilder.DefineDynamicModule("MyModFor_"+targetType.Name);//新类型的名称:随便定一个StringnewTypeName="Imp_"+targetType.Name;//新类型的属性:要创建的是Class,而非Interface,AbstractClass等,而且是Public的TypeAttributesnewTypeAttribute=TypeAttributes.Class|TypeAttributes.Public;//声明要创建的新类型的父类型TypenewTypeParent;//声明要创建的新类型要实现的接口Type[]newTypeInterfaces;//对于基类型是否为接口,作不同处理if(targetType.IsInterface){newTypeParent=null;newTypeInterfaces=newType[]{targetType};}else{newTypeParent=targetType;newTypeInterfaces=newType[0];}//得到类型生成器TypeBuildertypeBuilder=modBuilder.DefineType(newTypeName,newTypeAttribute,newTypeParent,newTypeInterfaces);//以下将为新类型声明方法:新类型应该override基类型的所以virtual方法//得到基类型的所有方法MethodInfo[]targetMethods=targetType.GetMethods();//遍历各个方法,对于Virtual的方法,获取其签名,作为新类型的方法foreach(MethodInfotargetMethodintargetMethods){//只挑出virtual的方法if(targetMethod.IsVirtual){//得到方法的各个参数的类型ParameterInfo[]paramInfo=targetMethod.GetParameters();Type[]paramType=newType[paramInfo.Length];for(inti=0;i<paramInfo.Length;i++)paramType[i]=paramInfo[i].ParameterType;//传入方法签名,得到方法生成器MethodBuildermethodBuilder=typeBuilder.DefineMethod(targetMethod.Name,MethodAttributes.Public|MethodAttributes.Virtual,targetMethod.ReturnType,paramType);//由于要生成的是具体类,所以方法的实现是必不可少的。而方法的实现是通过EmitIL代码来产生的//得到IL生成器ILGeneratorilGen=methodBuilder.GetILGenerator();//以下三行相当于:{Console.Writeln("I'm"+targetMethod.Name+"ing");}ilGen.Emit(OpCodes.Ldstr,"I'm"+targetMethod.Name+"ing");ilGen.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",newType[]{typeof(String)}));ilGen.Emit(OpCodes.Ret);}}//真正创建,并返回return(typeBuilder.CreateType());}}//好了,测试一下试试看:publicclassTester{publicstaticvoidMain(String[]args){TypeCreatortc=newTypeCreator(typeof(IAnimal));Typet=tc.build();IAnimalanimal=(IAnimal)Activator.CreateInstance(t);animal.move();animal.eat();Console.Read();}}
解决方案
解决方案二:
转载自:
解决方案三:
装箱,拆箱以及反射:http://blog.programfan.com/article.asp?id=16780
解决方案四:
当泛型的参数类型是动态的:
解决方案五:
UP
解决方案六:
看了楼主的一些帖子,觉得楼主很执着...很适合学这个啊,我就懒多了,啥啥不会,不遇到就不会...
解决方案七:
我也一样,能解决就行了,不管其它的