你的位置:首页 > ASP.net教程

[ASP.net教程]私有方法是封闭的?使用反射来调用一个对象的私有方法。


当我们学习C# 时接触的第一套关键字 可能就是 Private, Public, protect。

Private的定义是: 用此关键字定义的方法和变量只能在对象内部使用。

但是这是绝对的么?有没有办法在调用者的空间中使用Private定义的方法或者变量呢?

让我们定义如下一个类:

  1. public class testObj
  2. {
  3.     public string PublicValue { get; set; }
  4.     private string _privateValue;
  5.  
  6.     public testObj()
  7.     {
  8.         _privateValue = "private";
  9.         PublicValue = "public";
  10.     }
  11.  
  12.     public testObj(string value)
  13.     {
  14.         _privateValue = "private_" + value;
  15.         PublicValue = "public_" + value;
  16.     }
  17.  
  18.     private string returnPrivateValue()
  19.     {
  20.         return _privateValue;
  21.     }
  22. }

那在这个简单程序中我们可以访问_priavateValue么?

  1. static void Main(string[] args)
  2. {
  3.     testObj to = new testObj("test");
  4.     Console.WriteLine("obj public parameter:{0}",to.PublicValue);
  5.     Console.WriteLine("obj public parameter:{0}", to. returnPrivateValue());
  6.  
  7.     Console.Read();
  8. }

当我们尝试编译这段简单程序时会得到一个编译错误。

'PrivateCallByReflection.testObj.returnPrivateValue()' is inaccessible due to its protection level

那么private 真的就是安全的,只能内部访问的么?

一个小小的trick即可得到我们想要的结果

  1. static void Main(string[] args)
  2. {
  3.     testObj to = new testObj("test");
  4.     Console.WriteLine("obj public parameter:{0}",to.PublicValue);
  5.     //Console.WriteLine("obj public parameter:{0}", to.returnPrivateValue());
  6.  
  7.     MethodInfo privateMethod = typeof(testObj).GetMethod("returnPrivateValue", BindingFlags.Instance | BindingFlags.NonPublic);
  8.     Console.WriteLine("obj private method 'returnPrivateValue' return :{0}", privateMethod.Invoke(to, new object[] { }));
  9.  
  10.     Console.Read();
  11. }

请注意下划线标示的代码。

反射帮助我们访问了一个Private的方法。

无下限的反射,真的是没什么不可以的。。。。。