C#中访问私有成员
首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员造访,可以套用下面这种非常好的方式去解决。
private string name;public string Name{ get return name; } set { name = value; }}
但是有时候,源代码是别人的,只提供给你dll。或者你去维护别人的代码,源代码却有丢失。这样的情况或许你想知道私有成员的值,甚至去想直接调用类里面的私有方法。那怎么办呢?在.net中访问私有成员不是很难,这篇文章提供几个简单的方法让你如愿以偿。
为了让代码用起来优雅,使用扩展方法去实现。
1、得到私有字段的值:
public static T GetPrivateField<T>(this object instance, string fieldname){ BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; Type type = instance.GetType(); FieldInfo field = type.GetField(fieldname, flag); return (T)field.GetValue(instance);}
2、得到私有属性的值:
public static T GetPrivateProperty<T>(this object instance, string propertyname){ BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; Type type = instance.GetType(); PropertyInfo field = type.GetProperty(propertyname, flag); return (T)field.GetValue(instance, null);}
3、设置私有成员的值:
public static void SetPrivateField(this objectinstance, stringfieldname, objectvalue)
BindingFlagsflag = BindingFlags.Instance | BindingFlags.NonPublic;
Typetype = instance.GetType();
FieldInfofield = type.GetField(fieldname, flag);
field.SetValue(instance, value);
4、设置私有属性的值:
public static void SetPrivateProperty(this objectinstance, stringpropertyname, objectvalue)
BindingFlagsflag = BindingFlags.Instance | BindingFlags.NonPublic;
Typetype = instance.GetType();
PropertyInfofield = type.GetProperty(propertyname, flag);
field.SetValue(instance, value, null);
5、调用私有方法:
public static T CallPrivateMethod<T>(this object instance, string name, params object[] param){ BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; Type type = instance.GetType(); MethodInfo method = type.GetMethod(name, flag); return (T)method.Invoke(instance, param);}
测试:
下面我们使用一个测试类,进行测试。新建一个类库项目,测试的类代码如下:
public class TestClasspublic TestClass() { privatefield1 = 1; privatefield2 = 99; PrivateFieldA = "Lo"; PrivateFieldB = "ve"; } private int privatefield1; private int privatefield2; private string PrivateFieldA { getset; } private string PrivateFieldB { getset; } private int Add() { return privatefield1 + privatefield2; } private string Join() { return PrivateFieldA + PrivateFieldB; }}
将上面类库的dll引入控制台项目中。使用下面代码去使用这个类的私有成员:
TestClass obj = new TestClass();System.Console.WriteLine("私有字段");System.Console.WriteLine(obj.GetPrivateField<int>("privatefield1"));System.Console.WriteLine(obj.GetPrivateField<int>("privatefield2"));System.Console.WriteLine("私有属性");System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldA"));System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldB"));System.Console.WriteLine("私有方法");System.Console.WriteLine(obj.CallPrivateMethod<int>("Add",null));System.Console.WriteLine(obj.CallPrivateMethod<string>("Join"null));System.Console.WriteLine("修改私有属性");obj.SetPrivateProperty("PrivateFieldA""hello");obj.SetPrivateProperty("PrivateFieldB""world");System.Console.WriteLine(obj.CallPrivateMethod<string>("Join"null));System.Console.Read();
结果如下:

总结:实现对类私有成员的访问。点击下载源码
C#中访问私有成员的更多相关文章
- C#中访问私有成员技巧
源代码是别人的,你就不能修改源代码,只提供给你dll.或者你去维护别人的代码,源代码却有丢失.这样的情况如果你想知道私有成员的值,甚至去想直接调用类里面的私有方法.那怎么办呢?其实在.net中访问私有 ...
- C#中访问私有成员--反射
首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...
- 『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
目录 1.Python支持多层继承 (1)多层继承实现 (2)多层继承和多重继承区别 2.继承中的私有成员 (1)继承中父类私有属性和私有方法 (2)获取和修改私有属性值 1.Python支持多层继承 ...
- JavaScript中的私有成员[翻译]
原作者:Douglas Crockford,原文地址:http://www.crockford.com/javascript/private.html JavaScript 是世界上被误解最深的编程语 ...
- C#为何不推荐在构造函数中访问虚成员
如果在一个类中定义了虚属性或者虚方法,又在构造函数中访问了这个虚属性或方法,此时VisualStudio是不会给出警告,并且编译也没有问题,但是如果安装了Resharper插件则会给出警告提示:&qu ...
- C中的私有成员
skynet_context声明在.h里 但定义在.c里面 外部使用的时候无法用ctx->handle获取私有成员,会提示解引用类型错误 必须用.h里函数获取ctx里属性.
- 使用C#反射机制访问类的私有成员【转】
首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...
- VC6.0中友元函数无法访问类私有成员的解决办法
举个例子: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #inclu ...
- C++ //继承中的对象模型 //利用开发人员命令提示工具查看对象模型 //父类中所有非静态成员属性都会被 子类继承下去 //父类中私有成员属性 是被编译器给隐藏了 因此是访问不到 但是确实被继承下去了
1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 /* 9 #include &l ...
随机推荐
- 在linux上安装rz、sz包
在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于RHEL5, rz/sz默认没有安装所以需要手工安装.sz: 将选定的文件发送(send) ...
- PWA学习心得
PWA学习心得 一.什么是PWA Progressive Web App , (渐进式增强 WEB 应用) 简称 PWA ,是提升WebApp的体验的一种新方法,能给用户原生应用的体验. PWA ...
- win10 uwp DataContext
本文告诉大家DataContext的多种绑法. 适合于WPF的绑定和UWP的绑定. 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用.当然,可以在新手面前秀下,一个页面 ...
- hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)
SDUST的训练赛 当时死磕这个水题3个小时,也无心去搞其他的 按照题意,转换成无向图,预处理去掉单向的边,然后判断剩下的图能否构成两个无向完全图(ps一个完全图也行或是一个完全图+一个孤点) 代码是 ...
- 使用 Prometheus + Grafana 对 Kubernetes 进行性能监控的实践
1 什么是 Kubernetes? Kubernetes 是 Google 开源的容器集群管理系统,其管理操作包括部署,调度和节点集群间扩展等. 如下图所示为目前 Kubernetes 的架构图,由 ...
- dubbo的架构
dubbo架构图如下所示: 节点角色说明: Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. Monitor: ...
- Python3处理HTML获取所需内容
处理HTML页面,经常使用的便是使用beautifulsoup库 pip install beautifulsoup4 执行上述语句下载bs4库 一般请求下来的所需数据都位于tbody的tr标签里,下 ...
- [poj1644]放苹果
题目链接:http://poj.org/problem?id=1664 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5, ...
- php mysqli MySQL server has gone away 问题分析
结论 mysqli没有处理对端(MySQL server)的断开请求.在send时,收到对端(MySQL server)的RST,会打印MySQL server has gone away. 环境 x ...
- Yii2之行为
Yii三大特性:属性.事件.行为.前面两篇文章已经分别讲解了属性和事件,本文接着讲讲yii的行为,分析yii行为的实现原理. 在yii中,一个对象绑定了行为之后,就拥有了所绑定行为拥有的所有事件,而且 ...