C# 反射机制(reflection)实现对私有成员的访问
2012-12-26 13:48
190 查看
假如我有这么一个类
在C#, 类默认的访问类型是内部internal 即在一个Assembly内是可以访问的, assembly可以是单独的一个dll,exe文件等。但是类的成员变量默认是private。当我做单元测试需要测试这些私有函数的时候,C#像Java一样提供了反射Reflection机制来帮助你访问私有成员。
这里需要注意的是 一定要有参数BindingFlags.NonPublic | BindingFlags.Instance,必须指定是BindingFlags.Instance还是BindingFlags.Static 如果成员是静态成员一定要选择BindingFlags.Static,不然就得是BindingFlags.Instance。 成员的访问类型也得有,BindingFlags.NonPublic或者BindingFlags.Public。
class Employee { string name; void GetPaid( int amount ) {} int reward() {} class Task { int cycles = 3; } }
在C#, 类默认的访问类型是内部internal 即在一个Assembly内是可以访问的, assembly可以是单独的一个dll,exe文件等。但是类的成员变量默认是private。当我做单元测试需要测试这些私有函数的时候,C#像Java一样提供了反射Reflection机制来帮助你访问私有成员。
using System.Reflection; static void main() { Type type = typeof(Employee); Employee employee = (Employee)type.GetConstructor(System.Type.EmptyTypes).Invoke(null); // 实例化对象 MethodInfo method1 = type.GetMethod("GetPaid", BindingFlags.NonPublic | BindingFlags.Instance); // 获得GetPaid方法 method1.Invoke(employee, new Object[] { 2000 }); // 调用方法,传递对象employee和参数 MethodInfo method2 = type.GetMethod("reward", BindingFlags.NonPublic | BindingFlags.Instance); // 获得reward方法 int result1 = (int)method2.Invoke(employee, null); // reward 方法没有参数,故null type.GetField("name", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(employee, "zhaobo"); // 给私有变量赋值 Type nestedType = type.GetNestedType("Task", BindingFlags.NonPublic | BindingFlags.Instance); // 获得内部类类型 Object obj = nestedType.GetConstructor(System.Type.EmptyTypes).Invoke(null); // 实例化内部类对象 int result2 = nestedType.GetField("cycles", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj ); // 获得私有变量的值 }
这里需要注意的是 一定要有参数BindingFlags.NonPublic | BindingFlags.Instance,必须指定是BindingFlags.Instance还是BindingFlags.Static 如果成员是静态成员一定要选择BindingFlags.Static,不然就得是BindingFlags.Instance。 成员的访问类型也得有,BindingFlags.NonPublic或者BindingFlags.Public。
相关文章推荐
- 使用C#反射机制访问类的私有成员【转】
- C# 利用反射访问修改私有成员
- JAVA中的反射机制对私有成员的访问
- java中的反射机制——如何访问私有成员的私有方法
- C#中访问私有成员--反射
- JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量
- java 反射机制 之 getDeclaredField 获取私有保护字段, 再setAccessible(true)取消对权限的检查 实现对私有的访问和赋值
- 使用类的反射机制来访问类的私有成员变量
- 反射访问私有成员和方法
- c#访问类的私有成员的三种方法
- java利用反射访问类的私有成员
- C#利用反射调用基类私有方法 及 Unity实现自定义InputField
- C#中访问私有成员
- java反射访问私有成员变量
- C#中访问私有成员详解
- C#中访问私有成员
- 反射——反射访问私有成员
- C#中访问私有成员
- C#箴言之用属性来访问类的私有成员
- C#中访问私有成员