C# GetField方法的應(yīng)用實(shí)例講解
關(guān)于 C# Type 類(lèi)
Type表示類(lèi)型聲明:類(lèi)類(lèi)型、接口類(lèi)型、數(shù)組類(lèi)型、值類(lèi)型、枚舉類(lèi)型、類(lèi)型參數(shù)、泛型類(lèi)型定義,以及開(kāi)放或封閉構(gòu)造的泛型類(lèi)型。調(diào)用 this.GetType() 方法得到Type對(duì)象,可獲取成員信息,如方法名、變量名。更多學(xué)習(xí)請(qǐng)參照以下鏈接:
Type 類(lèi) (System) | Microsoft Learn
本文以數(shù)據(jù)采集應(yīng)用實(shí)例介紹 Type.GetField 方法的實(shí)際應(yīng)用。
GetField 方法應(yīng)用
GetField 是獲取當(dāng)前 Type 的特定方法,我們?cè)谶@里介紹 GetField(String, BindingFlags) 即使用指定的綁定約束搜索指定的字段變量。
其中 string name 表示要搜索的方法名稱(chēng),System.Reflection.BindingFlags 枚舉可見(jiàn)下表:
| 序號(hào) | 篩選器標(biāo)志 | 說(shuō)明 |
|---|---|---|
| 1 | BindingFlags.Instance 或 BindingFlags.Static | 必須指定實(shí)例或靜態(tài)方可有效返回 |
| 2 | BindingFlags.Public | 搜索當(dāng)前 Type 中包含的公共方法 |
| 3 | BindingFlags.NonPublic | 搜索當(dāng)前 Type 中包含的非公共方法 、私有方法、內(nèi)部方法和保護(hù)方法 |
| 4 | BindingFlags.FlattenHierarchy | 在層次結(jié)構(gòu)中的包括 public 和 protected 靜態(tài)成員; private 繼承類(lèi)中的靜態(tài)成員不包括在層次結(jié)構(gòu)中 |
| 5 | BindingFlags.IgnoreCase | 忽略方法name的大小寫(xiě)進(jìn)行搜索 |
| 6 | BindingFlags.DeclaredOnly | 如果只搜索 Type 聲明的方法,則搜索只是繼承的方法 |
應(yīng)用舉例
心理CT設(shè)計(jì)題
假設(shè)我們有一組心理測(cè)評(píng)題目,共計(jì)10題,每題有 A、B、C、D、E、F 共計(jì)六個(gè)單選項(xiàng),分六個(gè)維度進(jìn)行計(jì)分,各初始維度得分均為0,如果符合條件則+1分,該維度如下表:
| 序號(hào) | 變量名 | 類(lèi)型 | 說(shuō)明 |
|---|---|---|---|
| 1 | 輕躁狂 | int | 其特征包括:氣質(zhì)昂揚(yáng),愛(ài)說(shuō)、精力充沛、易怒、思維奔逸、抑郁氣短等。 初始值為0 |
| 2 | 妄想狂 | int | 為了區(qū)分那些被判斷為具有關(guān)系妄想、被害妄想、夸大自我概念、猜疑心、過(guò)度地敏感、意見(jiàn)和態(tài)度生硬等偏執(zhí)性人格而制定。初始值為0 |
| 3 | 抑郁 | int | 抑郁的特征是缺乏干勁,對(duì)未來(lái)沒(méi)有希望,一般對(duì)自己的生活狀況極其不滿。 初始值為0 |
| 4 | 癔病 | int | 癔病的特征是心因性的不隨意肌體機(jī)能喪失和機(jī)能障礙。 初始值為0 |
| 5 | 疑病 | int | 其特征是對(duì)自己的身體健康的一種過(guò)度的關(guān)心,擔(dān)心自己有病或不健康。初始值為0 |
| 6 | 精神 | int | 其特征包括:思維、感情和行為混亂。初始值為0 |
初始化代碼如下:
int 輕躁狂=0; int 妄想狂=0; int 抑郁=0; int 癔病=0; int 疑病=0; int 精神=0;
基本的設(shè)計(jì)如下,通過(guò)被測(cè)試者對(duì)題目的理解,回答其中的選項(xiàng)(單選),則采集后的數(shù)據(jù)拼接為10個(gè)字母組合,如下:
string key1="BACCEDFABCD";
其中 key1 字符串即為被測(cè)試者的答案。
建立代碼對(duì)應(yīng)維度的字典變量 Dictionary<string, string> descript = new Dictionary<string, string>() ,如下代碼:
descript.Add("A", "輕躁狂");
descript.Add("B", "妄想狂");
descript.Add("C", "抑郁");
descript.Add("D", "癔病");
descript.Add("E", "疑病");
descript.Add("F", "精神");建立 Dictionary<string, int> dpct = new Dictionary<string, int>(); 字典變量,用于存儲(chǔ)模型的運(yùn)算值(每一題均不同),如下代碼:
dpct.Add("A1", 1);
dpct.Add("B1", 1);
dpct.Add("C1", 1);
dpct.Add("D1", 1);
dpct.Add("E1", 1);
dpct.Add("F1", 1);
dpct.Add("A2", 0);
dpct.Add("B2", 0);
dpct.Add("C2", 0);
dpct.Add("D2", 0);
dpct.Add("E2", 0);
dpct.Add("F2", 0);
dpct.Add("A3", 0);
dpct.Add("B3", 1);
dpct.Add("C3", 0);
dpct.Add("D3", 0);
dpct.Add("E3", 0);
dpct.Add("F3", 1);
dpct.Add("A4", 1);
dpct.Add("B4", 0);
dpct.Add("C4", 0);
dpct.Add("D4", 0);
dpct.Add("E4", 1);
dpct.Add("F4", 0);
dpct.Add("A5", 0);
dpct.Add("B5", 1);
dpct.Add("C5", 0);
dpct.Add("D5", 1);
dpct.Add("E5", 1);
dpct.Add("F5", 1);
dpct.Add("A6", 1);
dpct.Add("B6", 1);
dpct.Add("C6", 1);
dpct.Add("D6", 0);
dpct.Add("E6", 1);
dpct.Add("F6", 0);
dpct.Add("A7", 0);
dpct.Add("B7", 0);
dpct.Add("C7", 0);
dpct.Add("D7", 0);
dpct.Add("E7", 1);
dpct.Add("F7", 0);
dpct.Add("A8", 0);
dpct.Add("B8", 1);
dpct.Add("C8", 0);
dpct.Add("D8", 0);
dpct.Add("E8", 0);
dpct.Add("F8", 0);
dpct.Add("A9", 1);
dpct.Add("B9", 1);
dpct.Add("C9", 0);
dpct.Add("D9", 1);
dpct.Add("E9", 1);
dpct.Add("F9", 1);
dpct.Add("A10", 1);
dpct.Add("B10", 1);
dpct.Add("C10", 1);
dpct.Add("D10", 0);
dpct.Add("E10", 1);
dpct.Add("F10", 1);類(lèi)設(shè)計(jì)
創(chuàng)建一個(gè) DPCT 類(lèi)用于計(jì)算各維度的得分情況,該類(lèi)設(shè)計(jì)如下:
| 序號(hào) | 成員 | 類(lèi)型 | 說(shuō)明 |
|---|---|---|---|
| 1 | int 輕躁狂=0; int 妄想狂=0; int 抑郁=0; int 癔病=0; int 疑病=0; int 精神=0; | 屬性 | 6維度初始值,均為0; |
| 2 | Dictionary<string, string> descript = new Dictionary<string, string>() | 屬性 | 用于選項(xiàng)代碼與唯度對(duì)應(yīng)的字典 |
| 3 | Dictionary<string, int> dpct = new Dictionary<string, int>(); | 屬性 | 存儲(chǔ)每題答案對(duì)應(yīng)的計(jì)算得分 |
| 4 | string key1=""; | 方法 | 接收用戶的答案組合字符串 |
| 5 | public string countScrore() | 方法 | 計(jì)算各維度變量的得分 |
DPCT類(lèi)實(shí)現(xiàn)代碼
完整的DPCT類(lèi)示例代碼如下:
public class DPCT
{
int 輕躁狂=0;
int 妄想狂=0;
int 抑郁=0;
int 癔病=0;
int 疑病=0;
int 精神=0;
public string key1 = "";
Dictionary<string, string> descript = new Dictionary<string, string>();
Dictionary<string, int> dpct = new Dictionary<string, int>();
public DPCT()
{
descript.Add("A", "輕躁狂");
descript.Add("B", "妄想狂");
descript.Add("C", "抑郁");
descript.Add("D", "癔病");
descript.Add("E", "疑病");
descript.Add("F", "精神");
dpct.Add("A1", 1);
dpct.Add("B1", 1);
dpct.Add("C1", 1);
dpct.Add("D1", 1);
dpct.Add("E1", 1);
dpct.Add("F1", 1);
dpct.Add("A2", 0);
dpct.Add("B2", 0);
dpct.Add("C2", 0);
dpct.Add("D2", 0);
dpct.Add("E2", 0);
dpct.Add("F2", 0);
dpct.Add("A3", 0);
dpct.Add("B3", 1);
dpct.Add("C3", 0);
dpct.Add("D3", 0);
dpct.Add("E3", 0);
dpct.Add("F3", 1);
dpct.Add("A4", 1);
dpct.Add("B4", 0);
dpct.Add("C4", 0);
dpct.Add("D4", 0);
dpct.Add("E4", 1);
dpct.Add("F4", 0);
dpct.Add("A5", 0);
dpct.Add("B5", 1);
dpct.Add("C5", 0);
dpct.Add("D5", 1);
dpct.Add("E5", 1);
dpct.Add("F5", 1);
dpct.Add("A6", 1);
dpct.Add("B6", 1);
dpct.Add("C6", 1);
dpct.Add("D6", 0);
dpct.Add("E6", 1);
dpct.Add("F6", 0);
dpct.Add("A7", 0);
dpct.Add("B7", 0);
dpct.Add("C7", 0);
dpct.Add("D7", 0);
dpct.Add("E7", 1);
dpct.Add("F7", 0);
dpct.Add("A8", 0);
dpct.Add("B8", 1);
dpct.Add("C8", 0);
dpct.Add("D8", 0);
dpct.Add("E8", 0);
dpct.Add("F8", 0);
dpct.Add("A9", 1);
dpct.Add("B9", 1);
dpct.Add("C9", 0);
dpct.Add("D9", 1);
dpct.Add("E9", 1);
dpct.Add("F9", 1);
dpct.Add("A10", 1);
dpct.Add("B10", 1);
dpct.Add("C10", 1);
dpct.Add("D10", 0);
dpct.Add("E10", 1);
dpct.Add("F10", 1);
}
public string countScrore()
{
for (int i = 0; i < key1.Length; i++)
{
string anwser = key1.Substring(i, 1);
string varname = descript[anwser];
FieldInfo fi=this.GetType().GetField(varname, BindingFlags.NonPublic| BindingFlags.Instance);
fi.SetValue(this, (int)fi.GetValue(this) + dpct[anwser+(i+1).ToString()]);
}
}
}
countScore 核心方法取出每一個(gè)答案選項(xiàng)字母,根據(jù)代碼與維度對(duì)應(yīng)關(guān)系,取出要計(jì)算值的變量名稱(chēng)字符串,然后通過(guò)GetField方法查找到變量,并根據(jù)模型添加分值。
其基本設(shè)計(jì)如下圖所示:

調(diào)用 GetField 方法 得到 FieldInfo 對(duì)象,然后 FieldInfo 對(duì)象再執(zhí)行 SetValue 和 GetValue 方法執(zhí)行增加值操作。
小結(jié)
到此這篇關(guān)于C# GetField方法的應(yīng)用實(shí)例講解的文章就介紹到這了,更多相關(guān)C# GetField方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中winform控制textbox輸入只能為數(shù)字的方法
這篇文章主要介紹了C#中winform控制textbox輸入只能為數(shù)字的方法,包括使用keyPress事件限制鍵盤(pán)輸入以及TextChanged事件限制粘貼等情況,來(lái)實(shí)現(xiàn)控制輸入為數(shù)字的功能,需要的朋友可以參考下2015-01-01
C#實(shí)現(xiàn)串口通信的四種靈活策略和避坑指南
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)串口通信的四種靈活策略和避坑的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-01-01
舉例講解C#中自動(dòng)實(shí)現(xiàn)的屬性
這篇文章主要介紹了C#中自動(dòng)實(shí)現(xiàn)的屬性,包括使用自動(dòng)實(shí)現(xiàn)的屬性實(shí)現(xiàn)輕量類(lèi)的方法,需要的朋友可以參考下2016-01-01
淺析如何使用C#實(shí)現(xiàn)在Excel中創(chuàng)建下拉列表
在日常的數(shù)據(jù)管理和分析中,Excel 扮演著不可或缺的角色,本文將為您介紹如何利用 C# 編程語(yǔ)言和強(qiáng)大的第三方庫(kù) Spire.XLS for .NET,自動(dòng)化地在 Excel 中創(chuàng)建各種類(lèi)型的下拉列表,感興趣的小伙伴可以了解下2025-11-11

