当前位置: 代码迷 >> .NET相关 >> .NET中使用反照访问属性方法
  详细解决方案

.NET中使用反照访问属性方法

热度:206   发布时间:2016-04-24 02:34:17.0
.NET中使用反射访问属性方法
.net所编写的程序集包含两个重要部分:IL(中间语言代码) 和metadata(元数据)。我们编写的代码中不是有很多很多的类吗,类有很多很多的成员,在编译代码的时候,元数据表就根据代码把类的所有信息都记录在了它里面(其实它就是一个数据结构,组织类的信息)。
而反射的过程刚好相反,就是通过元数据里记录的关于类的详细信息找到该类的成员,并能使它“复活”(因为元数据里所记录的信息足够详细,以致于可以根据metadata里面记录的信息找到关于该类的IL code并加以利用)。
最后对比下:
元数据形成:根据代码具体内容形成类的记录信息;
反射:根据元数据的记录找到所需的代码;

先上代码:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.ComponentModel; 7 using System.Linq; 8 using System.Reflection; 9 10  public class reflectModel11     {12 13         public static void TestShowReflect()14         {15             //反射读取类私有属性16             Person per = new Person("ismallboy", "20102100104");17             Type t = per.GetType();18             //获取私有方法19             MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance);20             //访问无参数私有方法21             string strTest = method.Invoke(per, null).ToString();22             //访问有参数私有方法23             MethodInfo method2 = t.GetMethod("GetValue",         BindingFlags.NonPublic | BindingFlags.Instance);24             object[] par = new object[2];25             par[0] = "ismallboy";26             par[1] = 2;27             string strTest2 = method2.Invoke(per, par).ToString();28 29             //获取私有字段30             PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance);31             //访问私有字段值32             string value = field.GetValue(per).ToString();33             //设置私有字段值34             field.SetValue(per, "new Name");35             value = field.GetValue(per).ToString();36         }37     }38 39 40 /// <summary>41     /// 个人信息42     /// </summary>43     class Person44     {45         private string Name { get; set; }46         private string StuNo { get; set; }47 48         public Person(string name, string stuNo)49         {50             this.Name = name;51             this.StuNo = stuNo;52         }53 54         private string GetStuInfo()55         {56             return this.Name;57         }58 59         private string GetValue(string str, int n)60         {61             return str + n.ToString();62         }63     }
reflectModel

 

  相关解决方案