国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
詳解C#中如何訪問(wèn)私有成員 - 51CTO.COM
    本文將為大家介紹的是C#中如何訪問(wèn)私有成員,也包括得到私有字段的值和得到私有屬性的值。

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

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

    但是有時(shí)候,源代碼是別人的,只提供給你dll?;蛘吣闳ゾS護(hù)別人的代碼,源代碼卻有丟失。這樣的情況或許你想知道私有成員的值,甚至去想直接調(diào)用類(lèi)里面的私有方法。那怎么辦呢?在.net中訪問(wèn)私有成員不是很難,這篇文章提供幾個(gè)簡(jiǎn)單的方法讓你如愿以償。

     

    為了讓代碼用起來(lái)優(yōu)雅,使用擴(kuò)展方法去實(shí)現(xiàn)。

    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、設(shè)置私有成員的值:

            
    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、設(shè)置私有屬性的值:

            
    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、調(diào)用私有方法:

            
    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);  

    測(cè)試:

    下面我們使用一個(gè)測(cè)試類(lèi),進(jìn)行測(cè)試。新建一個(gè)類(lèi)庫(kù)項(xiàng)目,測(cè)試的類(lèi)代碼如下:

            
    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.     }  

    將上面類(lèi)庫(kù)的dll引入控制臺(tái)項(xiàng)目中。使用下面代碼去使用這個(gè)類(lèi)的私有成員:

            
    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(); 

    結(jié)果如下:

    總結(jié):實(shí)現(xiàn)對(duì)類(lèi)私有成員的訪問(wèn)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
(C#)利用反射動(dòng)態(tài)調(diào)用類(lèi)成員-程序開(kāi)發(fā)-紅黑聯(lián)盟
通過(guò)Type.InvokeMethod實(shí)現(xiàn)方法的重載
WF4.0 基礎(chǔ)篇 (十八) Flowchar
SqlParameter對(duì)象加到兩個(gè)Command中報(bào)錯(cuò)的內(nèi)部探秘—asp.net培訓(xùn)|W...
什么是反射、反射可以做些什么
C#反射 入門(mén)學(xué)習(xí) 01
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服