C#訪問及調(diào)用類中私有成員與方法示例代碼
開發(fā)背景
開發(fā)工具:VS2017
語言:C#
DotNet版本:.Net FrameWork 4.0及以上
系統(tǒng):Win10 X64
一、首先建立一個控制臺APP,并命名為ConsoleApp,如下圖所示:
二、新建一個Person類
并在類里面添加兩個成員,一個是name字段,另外一個是Display方法,該方法帶有一個“前綴”輸入?yún)?shù)prefix,用于加在name字段前面,如下代碼所示:
class Person
{
string name;
void Display(string prefix)
{
Console.WriteLine($"{prefix},{name}");
}
}
三、將System.Reflection引用進(jìn)來,這里是本隨筆的關(guān)鍵所在
如下圖所示:
using System.Reflection;
四、如何設(shè)置及訪問name字段?
在這里我們使用反射技術(shù),使用Type類里的反射機(jī)制進(jìn)行訪問,
1)公用部分,具體代碼如下:
Person person = new Person();
Type type = typeof(Person);
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
FieldInfo fInfo = type.GetField("name", flags);
2)設(shè)置name字段,設(shè)置方法如下代碼所示:
fInfo.SetValue(person,"CNXY");
3)訪問name字段,訪問方法如下代碼所示:
var name = fInfo.GetValue(person);
4)name字段結(jié)果如下:
說明:
BindingFlags.NonPublic:搜索非公有方法的成員;
BindingFlags.Instance:搜索成員實例,包括字段及方法等。
五、如何訪問Display私有方法?
同樣,借用第四部分代碼(person及flags),具體代碼如下:
MethodInfo mInfo = type.GetMethod("Display",flags);
mInfo.Invoke(person, new object[] { "Hello" });
輸出結(jié)果如下:
說明:
Invoke用于調(diào)用方法,后面的參數(shù)使用數(shù)組的方法,如有一個參數(shù),則輸入一個參數(shù)的object數(shù)組,如有多個參數(shù),則輸入多個參數(shù)的object數(shù)組。
六、源代碼如下:
http://xiazai.jb51.net/201806/yuanma/ConsoleApp_jb51.rar
七、實際用處
System.Windows.Forms下面有一個類,名叫NotifyIcon,其設(shè)置的Text只能是63個字符,所想輸入大于63個字符,如下設(shè)置方法是行不通的,代碼如下:
NotifyIcon ni = new NotifyIcon(); ni.Text = "64個字符(實際有64個字符,這里并沒有達(dá)到個數(shù),僅作展示)";
那么,我們必須另外的方法來繞過NotifyIcon的限制,這里使用了反射技術(shù)(也就是以上所說的),代碼如下:
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 });
以上的限制個數(shù)為大于63個,小于127個。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。
上一篇:C#使用private font改變PDF文件的字體詳解
欄 目:C#教程
本文標(biāo)題:C#訪問及調(diào)用類中私有成員與方法示例代碼
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5155.html
您可能感興趣的文章
- 01-10C#調(diào)用dos窗口獲取相關(guān)信息的方法
- 01-10C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫的方法
- 01-10同步調(diào)用和異步調(diào)用WebService
- 01-10C#調(diào)用WebService實例開發(fā)
- 01-10C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
- 01-10C#訪問SQL Server數(shù)據(jù)庫的實現(xiàn)方法
- 01-10C# 調(diào)用 JavaWebservice服務(wù)遇到的問題匯總
- 01-10詳解C#中的接口屬性以及屬性訪問器的訪問限制
- 01-10在C#使用字典存儲事件示例及實現(xiàn)自定義事件訪問器
- 01-10基于C#實現(xiàn)手機(jī)號碼歸屬地接口調(diào)用


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改


