首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员造访,可以套用下面这种非常好的方式去解决。
- privatestringname;
-
publicstringName
- {
-
get
- {
-
returnname;
- }
-
set
- {
- name=value;
- }
- }
但是有时候,源代码是别人的,只提供给你dll。或者你去维护别人的代码,源代码却有丢失。这样的情况或许你想知道私有成员的值,甚至去想直接调用类里面的私有方法。那怎么办呢?在.net中访问私有成员不是很难,这篇文章提供几个简单的方法让你如愿以偿。
为了让代码用起来优雅,使用扩展方法去实现。
1、得到私有字段的值:
- publicstaticTGetPrivateField<T>(thisobjectinstance,stringfieldname)
- {
- BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
- Typetype=instance.GetType();
- FieldInfofield=type.GetField(fieldname,flag);
-
return(T)field.GetValue(instance);
- }
2、得到私有属性的值:
- publicstaticTGetPrivateProperty<T>(thisobjectinstance,stringpropertyname)
- {
- BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
- Typetype=instance.GetType();
- PropertyInfofield=type.GetProperty(propertyname,flag);
-
return(T)field.GetValue(instance,null);
- }
3、设置私有成员的值:
- publicstaticvoidSetPrivateField(thisobjectinstance,stringfieldname,objectvalue)
- {
- BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
- Typetype=instance.GetType();
- FieldInfofield=type.GetField(fieldname,flag);
- field.SetValue(instance,value);
- }
4、设置私有属性的值:
- publicstaticvoidSetPrivateProperty(thisobjectinstance,stringpropertyname,objectvalue)
- {
- BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
- Typetype=instance.GetType();
- PropertyInfofield=type.GetProperty(propertyname,flag);
-
field.SetValue(instance,value,null);
- }
5、调用私有方法:
- publicstaticTCallPrivateMethod<T>(thisobjectinstance,stringname,paramsobject[]param)
- {
- BindingFlagsflag=BindingFlags.Instance|BindingFlags.NonPublic;
- Typetype=instance.GetType();
- MethodInfomethod=type.GetMethod(name,flag);
-
return(T)method.Invoke(instance,param);
- }
测试:
下面我们使用一个测试类,进行测试。新建一个类库项目,测试的类代码如下:
- publicclassTestClass
- {
-
publicTestClass()
- {
- privatefield1=1;
- privatefield2=99;
-
PrivateFieldA="Lo";
-
PrivateFieldB="ve";
- }
-
privateintprivatefield1;
-
privateintprivatefield2;
-
-
privatestringPrivateFieldA
- {
-
get;
-
set;
- }
-
privatestringPrivateFieldB
- {
-
get;
-
set;
- }
-
privateintAdd()
- {
-
returnprivatefield1+privatefield2;
- }
-
privatestringJoin()
- {
-
returnPrivateFieldA+PrivateFieldB;
- }
- }
将上面类库的dll引入控制台项目中。使用下面代码去使用这个类的私有成员:
- TestClassobj=newTestClass();
-
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#中访问私有成员
链接:http://www.cnblogs.com/zhuqil/archive/2010/07/25/Access-Private-Member.html
分享到:
相关推荐
-载入 -遍历属性 -调用方法 -破坏单例(调用私有方法) -调用属性 -调用泛型方法 -https://blog.csdn.net/qq_29756987/article/details/95949288
属性是一种成员,它提供灵活的机制来读取、写入或计算私有字段的值。属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法。这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性。 在此示例中,...
任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论: public struct Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; ...
本文实例讲述了C# RSA分段加解密实现方法。分享给大家供大家参考,具体如下: RSA加解密: 1024位的证书,加密时最大支持117个字节,解密时为128; 2048位的证书,加密时最大支持245个字节,解密时为256。 加密时支持...
释一:属性的访问器包含与获取(读取或计算)...以下是返回私有字段 name 的值的 get 访问器: 代码如下:private string name; // the name fieldpublic string Name // the Name property{ get { return name; }}
但对于基类的私有成员,派生类虽然继承了,但是不能在派生类中访问。 2、所有的类都是按照继承链从顶层基类开始向下顺序构造。最顶层的基类是System.Object类,所有的类都隐式派生于它。只要记住这条规则,就能理解...
属性是一种类的成员,它的实现类似函数,访问类似字段。它的作用是提供一种灵活和安全的机制来访问,修改私有字段。所以属性必须依赖于字段
会对很多小细节详解。) 单例模式的定义: 确保一个类只有一个实例,并提供一个全局访问点。 首先实例大家应该都明白就是类生成对象的过程简单的就是String s=new String(),则s就是个实例。 Q:如何只生成一个实例? ...
毕竟,作为一门支持OOP的语言,掌握子类、基类是学习C#的基础。不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧。 子类继承基类非私有方法 首先我们看最简单的一种,子类继承自基类,但...
C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件...