您的位置:首页 > 编程语言 > C#

C# 反射机制(reflection)实现对私有成员的访问

2012-12-26 13:48 190 查看
假如我有这么一个类
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: