首页 > 学院 > 开发设计 > 正文

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

2019-11-17 02:24:13
字体:
来源:转载
供稿:网友

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

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

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

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

让我们定义如下一个类:

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

那在这个简单程序中我们可以访问_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. Console.Read();
  7. }

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

'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. MethodInfo privateMethod = typeof(testObj).GetMethod("returnPrivateValue", BindingFlags.Instance | BindingFlags.NonPublic);
  7. Console.WriteLine("obj private method 'returnPrivateValue' return :{0}", privateMethod.Invoke(to, new object[] { }));
  8. Console.Read();
  9. }

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

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表