如果是C++,我们可以计算对象内成员的位置,然后偏移指针以访问类型的所有非公开成员。但是.NET对象完全受GC管理,地址根本无法得到,并且也无法通过指针调用方法。
当然... 这是一种很不值得推荐的技巧,访问非公有成员很可能破坏对象状态,造成不可预料的后果。但是无论如何,利用.NET的反射机制可以轻松做到这一点。
比如这样一个类:
class MyClass { private string PrivateField = "Private Field"; protected string ProtectedField = "Protected Field";
private string _ProtectedProperty = "Protected Property"; protected string ProtectedProperty { get{return _ProtectedProperty;} set{_ProtectedProperty = value;} }
private string _PrivateProperty = "Private Property"; private string PrivateProperty { get{return _PrivateProperty;} set{_PrivateProperty = value;} }
protected void ProtectedMethod() { Console.WriteLine("Protected Method Invoked"); }
private void PrivateMethod() { Console.WriteLine("Private Method Invoked"); } }
除了默认的构造函数,没有任何成员是公开的,但是我仍然想获取和设置Field和Property的值,以及调用那两个方法。方法是:
输出:
除了Field、Property、Method,对象还有一种成员?对,事件,一样可以操作,答案是EventInfo :-) 
|