欢迎来到天天文库
浏览记录
ID:33781312
大小:81.00 KB
页数:4页
时间:2019-03-01
《属性和索引器的反射调用和emit》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、属性和索引器的反射调用和Emit反射调用属性属性其实背后就是两个方法,编译器在编译XXX属性时,实际产生了get_XXX和set_XXX两个方法,这两个方法根据属性类型可以是静态或者非静态的,方法是public,运行环境直接可以调用。看这样一个类:classProgram{ staticintid; publicstaticintId { get { Console.WriteLine("get");
2、 returnid; } set { Console.WriteLine("set"); id=value;}}}Program有一个属性:Id,背后是一个字段id。编译这句话:Program.Id=43;IL是:ldc.i4.s43callvoidMgen.Program::set_Id(int32)可以看出来,程序执行根本没有所谓的“属性”这一概念,最终就是函数调用。这
3、些方法都是有“specialname”修饰符,所以编译器会特殊对待这些方法,而在运行时刻,它们就是普通的方法。比上面Id属性set的背后方法:set_Id.methodpublichidebysigspecialnamestaticint32get_Id()cilmanaged因此,属性的反射使用有两种方法,一种是用内置的PropertyInfo,另一种是直接得到属性的背后方法。另外PropertyInfo也提供GetGetMethod和GetSetMethod方法来返回属性背后的方法。代码:classPro
4、gram{ staticintid; publicstaticintId { get { Console.WriteLine("get");第4页 returnid; } set { Console.WriteLine("set"); id=value;
5、 } } staticvoidMain(string[]args) { vartype=typeof(Program); //通过属性的背后方法 varmethod=type.GetMethod("get_Id"); method.Invoke(null,null); //通过反射中的属性信息 varprop=type.GetProperty("I
6、d"); prop.GetValue(null,null); //PropertyInfo.GetSetMethod/GetGetMethod prop.GetSetMethod().Invoke(null,newobject[]{123}); }}输出:getgetset反射调用索引器索引器就是一个有参数的,特殊名称的属性。它就是一个属性,当然本质上跟属性一样都是方法。一般名称是”Item“。从PropertyInfo的GetIndex
7、Parameters方法可以返回该索引器的参数。代码:classProgram{ publicintthis[intarg1,intarg2] { get { Console.WriteLine("get"); returnarg1; } set { Console.WriteLine("set");第4
8、页 } } staticvoidMain(string[]args) { vartype=typeof(Program); varpro=newProgram(); vararg=newobject[]{123,456}; //通过属性的背后方法
此文档下载收益归作者所有