C#中如何访问私有成员

来源:互联网 发布:淘宝千人千面步骤 编辑:程序博客网 时间:2024/04/28 08:38

详解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

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

  • 原创粉丝点击