開發背景
開發工具:vs2017
語言:c#
dotnet版本:.net framework 4.0及以上
系統:win10 x64
一、首先建立一個控制臺app,并命名為consoleapp,如下圖所示:
二、新建一個person類
并在類里面添加兩個成員,一個是name字段,另外一個是display方法,該方法帶有一個“前綴”輸入參數prefix,用于加在name字段前面,如下代碼所示:
1
2
3
4
5
6
7
8
|
class person { string name; void display( string prefix) { console.writeline($ "{prefix},{name}" ); } } |
三、將system.reflection引用進來,這里是本隨筆的關鍵所在
如下圖所示:
1
|
using system.reflection; |
四、如何設置及訪問name字段?
在這里我們使用反射技術,使用type類里的反射機制進行訪問,
1)公用部分,具體代碼如下:
1
2
3
4
|
person person = new person(); type type = typeof (person); bindingflags flags = bindingflags.nonpublic | bindingflags.instance; fieldinfo finfo = type.getfield( "name" , flags); |
2)設置name字段,設置方法如下代碼所示:
1
|
finfo.setvalue(person, "cnxy" ); |
3)訪問name字段,訪問方法如下代碼所示:
1
|
var name = finfo.getvalue(person); |
4)name字段結果如下:
說明:
bindingflags.nonpublic:搜索非公有方法的成員;
bindingflags.instance:搜索成員實例,包括字段及方法等。
五、如何訪問display私有方法?
同樣,借用第四部分代碼(person及flags),具體代碼如下:
1
2
|
methodinfo minfo = type.getmethod( "display" ,flags); minfo.invoke(person, new object [] { "hello" }); |
輸出結果如下:
說明:
invoke用于調用方法,后面的參數使用數組的方法,如有一個參數,則輸入一個參數的object數組,如有多個參數,則輸入多個參數的object數組。
六、源代碼如下:
七、實際用處
system.windows.forms下面有一個類,名叫notifyicon,其設置的text只能是63個字符,所想輸入大于63個字符,如下設置方法是行不通的,代碼如下:
1
2
|
notifyicon ni = new notifyicon(); ni.text = "64個字符(實際有64個字符,這里并沒有達到個數,僅作展示)" ; |
那么,我們必須另外的方法來繞過notifyicon的限制,這里使用了反射技術(也就是以上所說的),代碼如下:
1
2
3
4
5
6
7
|
notifyicon ni = new notifyicon(); string text = "大于63個字符,小于127個字符的字符串" ; if (text.length >= 128) throw new argumentoutofrangeexception( "text limited to 127 characters" ); type t = typeof (notifyicon); bindingflags hidden = bindingflags.nonpublic | bindingflags.instance; t.getfield( "text" , hidden).setvalue(ni, text); if (( bool )t.getfield( "added" , hidden).getvalue(ni)) t.getmethod( "updateicon" , hidden).invoke(ni, new object [] { true }); |
以上的限制個數為大于63個,小于127個。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.cnblogs.com/cncc/p/8249768.html