码迷,mamicode.com
首页 > 其他好文 > 详细

私有方法是封闭的?使用反射来调用一个对象的私有方法。

时间:2015-05-08 17:51:10      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:

当我们学习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的方法。

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

私有方法是封闭的?使用反射来调用一个对象的私有方法。

标签:

原文地址:http://www.cnblogs.com/moshe/p/4488291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!