本文爲原創文章、源代碼爲原創代碼,如轉載/複製,請在網頁/代碼處明顯位置標明原文名稱、做者及網址,謝謝!html
開發工具:VS2017數組
語言:C#工具
DotNet版本:.Net FrameWork 4.0及以上開發工具
系統:Win10 X64spa
1、首先創建一個控制檯APP,並命名爲ConsoleApp,以下圖所示:code
2、新建一個Person類,並在類裏面添加兩個成員,一個是name字段,另一個是Display方法,該方法帶有一個「前綴」輸入參數prefix,用於加在name字段前面,以下代碼所示:orm
class Person { string name; void Display(string prefix) { Console.WriteLine($"{prefix},{name}"); } }
3、將System.Reflection引用進來,這裏是本隨筆的關鍵所在,以下圖所示:htm
using System.Reflection;
4、如何設置及訪問name字段?在這裏咱們使用反射技術,使用Type類裏的反射機制進行訪問,blog
1)公用部分,具體代碼以下:開發
Person person = new Person(); Type type = typeof(Person); BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo fInfo = type.GetField("name", flags);
2)設置name字段,設置方法以下代碼所示:
fInfo.SetValue(person,"CNXY");
3)訪問name字段,訪問方法以下代碼所示:
var name = fInfo.GetValue(person);
4)name字段結果以下:
說明:
BindingFlags.NonPublic:搜索非公有方法的成員;
BindingFlags.Instance:搜索成員實例,包括字段及方法等。
5、如何訪問Display私有方法?一樣,借用第四部分代碼(person及flags),具體代碼以下:
MethodInfo mInfo = type.GetMethod("Display",flags); mInfo.Invoke(person, new object[] { "Hello" });
輸出結果以下:
說明:
Invoke用於調用方法,後面的參數使用數組的方法,若有一個參數,則輸入一個參數的object數組,若有多個參數,則輸入多個參數的object數組。
6、源代碼以下:
7、實際用處,System.Windows.Forms下面有一個類,名叫NotifyIcon,其設置的Text只能是63個字符,所想輸入大於63個字符,以下設置方法是行不通的,代碼以下:
NotifyIcon ni = new NotifyIcon(); ni.Text = "64個字符(實際有64個字符,這裏並無達到個數,僅做展現)";
那麼,咱們必須另外的方法來繞過NotifyIcon的限制,這裏使用了反射技術(也就是以上所說的),代碼以下:
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個。