1 / 8
文档名称:

反射替代技术.doc

格式:doc   大小:112KB   页数:8页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

反射替代技术.doc

上传人:小雄 2020/3/17 文件大小:112 KB

下载得到文件列表

反射替代技术.doc

相关文档

文档介绍

文档介绍:2013-03-3117:25by鹤冲天,2648阅读,18评论,收藏,编辑园子里和这个话题的相关文章比较多,本文是旧话重提,外加个小的总结。主要因为近期看到很多同事、,却还在大量使用反I寸,不知道用新的方式。或有所了解,但又害怕性能不好不敢大胆去用。本文以如下类为例:lassMyMath2{3publicintAdd(inta,intb)4{5returna+b;6}7}替代反射的几种方式倒序说吧,从最先进最简单的开始。4弓|入了dynamic类型,:dynamicmmth=newMyMath();|intresult=(l?2);非常简单,效率也不错,可以看后面的性能对比测试结果。但有一点要注意,的访问级别限定,会对成员迸行可见性检查。也就是说,只能dynamic调用public成员;当然,如果是同一程序集内部,internal成员也是可以访问的。。简单地,我们可以使用lambda构建一颗ExpressionTree:1varmath=newMyMath();Expression<Func<int,int,int>>add=(a,b)=>(aJb);这种方法适合手工编码构建,还有另外一种方式可以动态构建:1varadd=typeof(MyMath)•GetMethod(11Addn);2345varmath=(typeof(MyMath));vara=(typeof(int),f,aH);varb=(typeof(int),nbf,);varbody=Expression>Ca11(myMath,add,a,b);6varlambda=Expression・Lambda〈Func〈MyMath,int,int,int>>(body,math,a,b);两种方式构建出的Tree是相同的。话归正题,构建出表达式树后,pile方法便可编译成一个委托,如下代码第3行:1varmath=newMyMath();Expression<Func<intint,int>>addExpTree=(a,b)=>(aJb); //ExressionTreeFunc<intJint,int>add=pile(); //编译成委托varresult=add(l,2); //相加,的访问级别限定,会对成员进行可见性检查,不能访问私有成员。,.。使用DynamicMethod类在运行时定义轻量全局方法,然后使用委托执行这些方法。,调用比前面两种方式复杂些:1|varaddMethod=typeof(MyMath).GetMethod("Add");vardynamicMethod=newDynamicMethod(""typeof(int),new[]{typeof(MyMath),typeof(i//456789101112varil=();il・Emit(OpCodes・