国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#訪問及調用類中私有成員與方法示例代碼

2019-10-29 19:59:03
字體:
來源:轉載
供稿:網友

開發背景

開發工具:VS2017

語言:C#

DotNet版本:.Net FrameWork 4.0及以上

系統:Win10 X64

一、首先建立一個控制臺APP,并命名為ConsoleApp,如下圖所示:

C#,私有成員,代碼

二、新建一個Person類

并在類里面添加兩個成員,一個是name字段,另外一個是Display方法,該方法帶有一個“前綴”輸入參數prefix,用于加在name字段前面,如下代碼所示:

class Person {  string name;  void Display(string prefix)  {   Console.WriteLine($"{prefix},{name}");  } }

三、將System.Reflection引用進來,這里是本隨筆的關鍵所在

如下圖所示:

using System.Reflection;

四、如何設置及訪問name字段?

在這里我們使用反射技術,使用Type類里的反射機制進行訪問,

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字段結果如下:

C#,私有成員,代碼

說明:

BindingFlags.NonPublic:搜索非公有方法的成員;

BindingFlags.Instance:搜索成員實例,包括字段及方法等。

五、如何訪問Display私有方法?

同樣,借用第四部分代碼(person及flags),具體代碼如下:

MethodInfo mInfo = type.GetMethod("Display",flags);mInfo.Invoke(person, new object[] { "Hello" });

輸出結果如下:

C#,私有成員,代碼

說明:

Invoke用于調用方法,后面的參數使用數組的方法,如有一個參數,則輸入一個參數的object數組,如有多個參數,則輸入多個參數的object數組。

 

七、實際用處

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個。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 运城市| 科尔| 顺昌县| 临桂县| 化州市| 永仁县| 潍坊市| 岳阳县| 罗源县| 明光市| 朝阳区| 乾安县| 漠河县| 平潭县| 洪湖市| 怀集县| 无棣县| 潜山县| 清丰县| 德阳市| 泗阳县| 墨玉县| 乐平市| 开平市| 玉龙| 三明市| 广元市| 辉县市| 子洲县| 苍溪县| 哈尔滨市| 台湾省| 廊坊市| 崇信县| 汉川市| 横峰县| 南丰县| 阿克| 怀化市| 栾川县| 仲巴县|