您好,今天是: ·加入收藏·设为首页·联系站长
| 首页 | 网络安全 | 软件工程 | 网站开发 | NET学院 | JAVA专栏 | C&C++ | 综合资讯 | 程序人生 | 业界动态 | 搜天社区 | 软件下载
站内搜索:
当前位置:搜天网 >> NET学院 >> 浏览文章 立即入驻本站 | 免费发布供应信息
.NET中,访问私有或者保护成员技巧
作者:佚名 来源:互联网 文章点击数:

如果是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的值,以及调用那两个方法。方法是:

MyClass mc = new MyClass();Type t = typeof(MyClass);BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;// FieldsFieldInfo fi_protected = t.GetField("ProtectedField",bf);FieldInfo fi_private = t.GetField("PrivateField",bf);Console.WriteLine(fi_protected.GetValue(mc));Console.WriteLine(fi_private.GetValue(mc));fi_private.SetValue(mc,"New Private Field");Console.WriteLine(fi_private.GetValue(mc));Console.WriteLine();// PropertiesPropertyInfo pi_protected = t.GetProperty("ProtectedProperty", bf);PropertyInfo pi_private = t.GetProperty("PrivateProperty", bf);Console.WriteLine(pi_protected.GetValue(mc,null));Console.WriteLine(pi_private.GetValue(mc,null));pi_private.SetValue(mc,"New Private Property",null);Console.WriteLine(pi_private.GetValue(mc,null));Console.WriteLine();// MethodsMethodInfo mi_protected = t.GetMethod("ProtectedMethod", bf);MethodInfo mi_private = t.GetMethod("PrivateMethod", bf);mi_protected.Invoke(mc,null);mi_private.Invoke(mc,null);Console.ReadLine();
输出:
Protected FieldPrivate FieldNew Private FieldProtected PropertyPrivate PropertyNew Private PropertyProtected Method InvokedPrivate Method Invoked



人支持

Tags:
发表评论】【告诉好友】【打印此文】【收藏此文】【关闭窗口
  最新文章
  热门文章
  推荐文章

| 设为首页 | 加入收藏 | 关于本站 | 联系站长 | 友情链接 | 版权申明 | 雁过留声 |

Copyright 2006-2008 Powered by soutian.NET,搜天网 All Rights Reserved.
服务电话:13568851603 传真:66297104 E-Mail:deige@yeah.net
咨询服务QQ:在线QQ