1、属性和索引器的反射调用和Emit反射调用属性属性其实背后就是两个方法,编译器在编译XXX属性时,实际产生了get_XXX和set_XXX两个方法,这两个方法根据属性类型可以是静态或者非静态的,方法是public,运行环境直接可以调用。看这样一个类:classProgram{ staticintid; publicstaticintId { get { Console.WriteLine("get"); returnid; }
2、 set { Console.WriteLine("set"); id=value;}}}Program有一个属性:Id,背后是一个字段id。编译这句话:Program.Id=43;IL是:ldc.i4.s43callvoidMgen.Program::set_Id(int32)可以看出来,程序执行根本没有所谓的“属性”这一概念,最终就是函数调用。这些方法都是有“specialname”修饰符,所以编译器会特殊对待这些方法,而在运行时刻,它们就是普通的方法。比上面Id属性set的背后方法:set_I
3、d.methodpublichidebysigspecialnamestaticint32get_Id()cilmanaged因此,属性的反射使用有两种方法,一种是用内置的PropertyInfo,另一种是直接得到属性的背后方法。另外PropertyInfo也提供GetGetMethod和GetSetMethod方法来返回属性背后的方法。代码:classProgram{ staticintid; publicstaticintId { get { Console.WriteLine
6、的,特殊名称的属性。它就是一个属性,当然本质上跟属性一样都是方法。一般名称是”Item“。从PropertyInfo的GetIndexParameters方法可以返回该索引器的参数。代码:classProgram{ publicintthis[intarg1,intarg2] { get { Console.WriteLine("get"); returnarg1; } set {