.NET中使用反射访问属性方法
2016-03-19 10:02
555 查看
.net所编写的程序集包含两个重要部分:IL(中间语言代码) 和metadata(元数据)。我们编写的代码中不是有很多很多的类吗,类有很多很多的成员,在编译代码的时候,元数据表就根据代码把类的所有信息都记录在了它里面(其实它就是一个数据结构,组织类的信息)。 而反射的过程刚好相反,就是通过元数据里记录的关于类的详细信息找到该类的成员,并能使它“复活”(因为元数据里所记录的信息足够详细,以致于可以根据metadata里面记录的信息找到关于该类的IL code并加以利用)。 最后对比下: 元数据形成:根据代码具体内容形成类的记录信息; 反射:根据元数据的记录找到所需的代码;
先上代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Linq; using System.Reflection; public class reflectModel { public static void TestShowReflect() { //反射读取类私有属性 Person per = new Person("ismallboy", "20102100104"); Type t = per.GetType(); //获取私有方法 MethodInfo method = t.GetMethod("GetStuInfo", BindingFlags.NonPublic | BindingFlags.Instance); //访问无参数私有方法 string strTest = method.Invoke(per, null).ToString(); //访问有参数私有方法 MethodInfo method2 = t.GetMethod("GetValue", BindingFlags.NonPublic | BindingFlags.Instance); object[] par = new object[2]; par[0] = "ismallboy"; par[1] = 2; string strTest2 = method2.Invoke(per, par).ToString(); //获取私有字段 PropertyInfo field = t.GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Instance); //访问私有字段值 string value = field.GetValue(per).ToString(); //设置私有字段值 field.SetValue(per, "new Name"); value = field.GetValue(per).ToString(); } } /// <summary> /// 个人信息 /// </summary> class Person { private string Name { get; set; } private string StuNo { get; set; } public Person(string name, string stuNo) { this.Name = name; this.StuNo = stuNo; } private string GetStuInfo() { return this.Name; } private string GetValue(string str, int n) { return str + n.ToString(); } }
reflectModel
相关文章推荐
- 网易互娱2017实习生招聘在线笔试第一场 题目1 : 电子数字
- 在fragment 传递数据的时候报:Parcel: unable to marshal value
- 更新Oracle的Date字段
- android studio快捷键
- Week 10:Large Scale Machine Learning课后习题解答
- js构建ui的统一异常处理方案(一)
- .net 安装部署诀窍
- 关于VMware上网的问题
- Linux Bash Shell
- 求二叉树宽度
- 94.Txx考试
- 数据链路层&网络层-教主
- python常用模块
- Android五种常用数据的存储方式
- 3629: [JLOI2014]聪明的燕姿|约数和|DFS
- 每天一点Swift(五)控制器的生命周期和SizeClass
- SVN使用
- TCP&UDP协议小结
- Class.forName(driver)出错。(解决)
- hdu 4941 Magical Forest(STL之map应用)