详解C#中如何访问私有成员

开发 后端
本文将为大家介绍的是C#中如何访问私有成员,也包括得到私有字段的值和得到私有属性的值。

首先访问一个类的私有成员不是什么好做法。大家都知道私有成员在外部是不能被访问的。一个类中会存在很多私有成员:如私有字段、私有属性、私有方法。对于私有成员造访,可以套用下面这种非常好的方式去解决。

  1. private string name;  
  2. public string Name  
  3. {  
  4.     get 
  5.     {  
  6.         return name;  
  7.     }  
  8.     set 
  9.     {  
  10.         name = value;  
  11.     }  

但是有时候,源代码是别人的,只提供给你dll。或者你去维护别人的代码,源代码却有丢失。这样的情况或许你想知道私有成员的值,甚至去想直接调用类里面的私有方法。那怎么办呢?在.net中访问私有成员不是很难,这篇文章提供几个简单的方法让你如愿以偿。

 

为了让代码用起来优雅,使用扩展方法去实现。

1、得到私有字段的值:

  1. public static T GetPrivateField<T>(this object instance, string fieldname)  
  2. {  
  3.     BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;  
  4.     Type type = instance.GetType();  
  5.     FieldInfo field = type.GetField(fieldname, flag);  
  6.     return (T)field.GetValue(instance);  

2、得到私有属性的值:

  1. public static T GetPrivateProperty<T>(this object instance, string propertyname)  
  2. {  
  3.     BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;  
  4.     Type type = instance.GetType();  
  5.     PropertyInfo field = type.GetProperty(propertyname, flag);  
  6.     return (T)field.GetValue(instance, null);  

3、设置私有成员的值:

  1. public static void SetPrivateField(this objectinstance, stringfieldname, objectvalue)   
  2. {   
  3.     BindingFlagsflag = BindingFlags.Instance | BindingFlags.NonPublic;   
  4.     Typetype = instance.GetType();   
  5.     FieldInfofield = type.GetField(fieldname, flag);   
  6.     field.SetValue(instance, value);   
  7. }  

4、设置私有属性的值:

  1. public static void SetPrivateProperty(this objectinstance, stringpropertyname, objectvalue)   
  2. {   
  3.     BindingFlagsflag = BindingFlags.Instance | BindingFlags.NonPublic;   
  4.     Typetype = instance.GetType();   
  5.     PropertyInfofield = type.GetProperty(propertyname, flag);   
  6.     field.SetValue(instance, value, null);   
  7. }  

5、调用私有方法:

  1. public static T CallPrivateMethod<T>(this object instance, string name, params object[] param)  
  2. {  
  3.     BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;  
  4.     Type type = instance.GetType();  
  5.     MethodInfo method = type.GetMethod(name, flag);  
  6.     return (T)method.Invoke(instance, param);  

测试:

下面我们使用一个测试类,进行测试。新建一个类库项目,测试的类代码如下:

  1. public class TestClass  
  2. {  
  3.  
  4.     public TestClass()  
  5.     {  
  6.         privatefield1 = 1;  
  7.         privatefield2 = 99;  
  8.         PrivateFieldA = "Lo";  
  9.         PrivateFieldB = "ve";  
  10.     }  
  11.  
  12.     private int privatefield1;  
  13.     private int privatefield2;  
  14.     
  15.  
  16.     private string PrivateFieldA  
  17.     {  
  18.         get;  
  19.         set;  
  20.     }  
  21.     private string PrivateFieldB  
  22.     {  
  23.         get;  
  24.         set;  
  25.     }  
  26.  
  27.  
  28.     private int Add()  
  29.     {  
  30.         return privatefield1 + privatefield2;  
  31.     }  
  32.     private string Join()  
  33.     {  
  34.         return PrivateFieldA + PrivateFieldB;  
  35.     }  

将上面类库的dll引入控制台项目中。使用下面代码去使用这个类的私有成员:

  1. TestClass obj = new TestClass();  
  2. System.Console.WriteLine("私有字段");  
  3. System.Console.WriteLine(obj.GetPrivateField<int>("privatefield1"));  
  4. System.Console.WriteLine(obj.GetPrivateField<int>("privatefield2"));  
  5.  
  6. System.Console.WriteLine("私有属性");  
  7. System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldA"));  
  8. System.Console.WriteLine(obj.GetPrivateProperty<string>("PrivateFieldB"));  
  9.  
  10. System.Console.WriteLine("私有方法");  
  11. System.Console.WriteLine(obj.CallPrivateMethod<int>("Add",null));  
  12. System.Console.WriteLine(obj.CallPrivateMethod<string>("Join"null));  
  13.  
  14. System.Console.WriteLine("修改私有属性");  
  15. obj.SetPrivateProperty("PrivateFieldA""hello");  
  16. obj.SetPrivateProperty("PrivateFieldB""world");  
  17. System.Console.WriteLine(obj.CallPrivateMethod<string>("Join"null));  
  18. System.Console.Read(); 

结果如下:

hhh

总结:实现对类私有成员的访问。

原文标题:C#中访问私有成员

链接:http://www.cnblogs.com/zhuqil/archive/2010/07/25/Access-Private-Member.html

[[13450]]

【编辑推荐】

  1. C#模式窗体中的按钮操作
  2. C#模式窗体操作详解
  3. C#窗体继承原理以及实现浅析
  4. C#窗体关闭事件的重载实现浅析
  5. C#窗体位置与大小设置详解
责任编辑:彭凡 来源: 博客园
相关推荐

2015-07-06 09:59:56

JavaScript私有成员

2009-07-22 10:08:48

Javascript私

2009-09-02 14:26:50

C#对接口成员访问

2009-08-28 14:09:19

C#静态类

2009-08-18 10:30:30

C#枚举

2009-07-31 16:06:50

成员函数构造函数C#

2009-01-19 10:26:02

C#Namespace.NET

2010-01-21 13:48:30

C++基类

2009-08-03 18:26:18

C#定义接口成员

2009-08-20 16:07:39

C#和ADO.NET访

2011-03-17 15:59:37

c#数据库

2009-08-24 10:06:31

C#接口成员

2010-05-12 08:42:02

C#

2009-09-02 16:52:55

C#数组初始化

2011-03-30 08:27:48

C#

2009-09-10 14:52:55

C# get

2009-08-31 17:02:28

C#接口编程

2021-01-20 05:53:25

C# ValueTupleTuple

2009-09-07 18:08:25

C#鼠标指针

2009-08-06 15:40:11

C#装箱和拆箱
点赞
收藏

51CTO技术栈公众号