麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

詳解C#中訪問私有成員的方法

2023-05-08 19:02:31
字體:
來源:轉載
供稿:網友

首先訪問一個類的私有成員不是什么好做法。大家都知道私有成員在外部是不能被訪問的。一個類中會存在很多私有成員:如私有字段、私有屬性、私有方法。對于私有成員造訪,可以套用下面這種非常好的方式去解決。


 
  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

總結:實現對類私有成員的訪問。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蜜桃91麻豆 | 国产一级做a爱片在线看免 2019天天干夜夜操 | 免费a级毛片永久免费 | 国产一级淫片在线观看 | videos 欧美 | 妇女毛片 | 国产一区二区在线免费播放 | 午夜精品成人一区二区 | 午夜色片 | 欧美一级aa免费毛片 | 一级啪啪片 | 国产精品久久久久久久久久久久午夜 | 久久国产综合精品 | javhdfreejaⅴhd | 免费a视频在线观看 | 国产中文av在线 | 九一免费版在线观看 | 成av人在线观看 | 欧美成人高清视频 | 久久精品毛片 | 久久久国产一级片 | 久久久婷婷一区二区三区不卡 | 高清av在线 | 草草视频免费观看 | 手机国产乱子伦精品视频 | 久久国产精 | 免费小毛片 | 久久看免费视频 | 99在线热视频 | 久久福利精品 | 手机免费看一级片 | 久久嗨| 欧美黑人一级 | 爱草在线| 久久经典免费视频 | hd性videos意大利复古 | 国产亚洲美女精品久久久2020 | 又黄又爽免费无遮挡在线观看 | 欧美亚洲综合在线 | 免费永久看羞羞片网站入口 | 一级做a爰片性色毛片2021 |