C# GetField方法的应用实例讲解
作者:初九之潜龙勿用
关于 C# Type 类
Type表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。调用 this.GetType() 方法得到Type对象,可获取成员信息,如方法名、变量名。更多学习请参照以下链接:
Type 类 (System) | Microsoft Learn
本文以数据采集应用实例介绍 Type.GetField 方法的实际应用。
GetField 方法应用
GetField 是获取当前 Type 的特定方法,我们在这里介绍 GetField(String, BindingFlags) 即使用指定的绑定约束搜索指定的字段变量。
其中 string name 表示要搜索的方法名称,System.Reflection.BindingFlags 枚举可见下表:
序号 | 筛选器标志 | 说明 |
---|---|---|
1 | BindingFlags.Instance 或 BindingFlags.Static | 必须指定实例或静态方可有效返回 |
2 | BindingFlags.Public | 搜索当前 Type 中包含的公共方法 |
3 | BindingFlags.NonPublic | 搜索当前 Type 中包含的非公共方法 、私有方法、内部方法和保护方法 |
4 | BindingFlags.FlattenHierarchy | 在层次结构中的包括 public 和 protected 静态成员; private 继承类中的静态成员不包括在层次结构中 |
5 | BindingFlags.IgnoreCase | 忽略方法name的大小写进行搜索 |
6 | BindingFlags.DeclaredOnly | 如果只搜索 Type 声明的方法,则搜索只是继承的方法 |
应用举例
心理CT设计题
假设我们有一组心理测评题目,共计10题,每题有 A、B、C、D、E、F 共计六个单选项,分六个维度进行计分,各初始维度得分均为0,如果符合条件则+1分,该维度如下表:
序号 | 变量名 | 类型 | 说明 |
---|---|---|---|
1 | 轻躁狂 | int | 其特征包括:气质昂扬,爱说、精力充沛、易怒、思维奔逸、抑郁气短等。 初始值为0 |
2 | 妄想狂 | int | 为了区分那些被判断为具有关系妄想、被害妄想、夸大自我概念、猜疑心、过度地敏感、意见和态度生硬等偏执性人格而制定。初始值为0 |
3 | 抑郁 | int | 抑郁的特征是缺乏干劲,对未来没有希望,一般对自己的生活状况极其不满。 初始值为0 |
4 | 癔病 | int | 癔病的特征是心因性的不随意肌体机能丧失和机能障碍。 初始值为0 |
5 | 疑病 | int | 其特征是对自己的身体健康的一种过度的关心,担心自己有病或不健康。初始值为0 |
6 | 精神 | int | 其特征包括:思维、感情和行为混乱。初始值为0 |
初始化代码如下:
int 轻躁狂=0; int 妄想狂=0; int 抑郁=0; int 癔病=0; int 疑病=0; int 精神=0;
基本的设计如下,通过被测试者对题目的理解,回答其中的选项(单选),则采集后的数据拼接为10个字母组合,如下:
string key1="BACCEDFABCD";
其中 key1 字符串即为被测试者的答案。
建立代码对应维度的字典变量 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>(); 字典变量,用于存储模型的运算值(每一题均不同),如下代码:
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);
类设计
创建一个 DPCT 类用于计算各维度的得分情况,该类设计如下:
序号 | 成员 | 类型 | 说明 |
---|---|---|---|
1 | int 轻躁狂=0; int 妄想狂=0; int 抑郁=0; int 癔病=0; int 疑病=0; int 精神=0; | 属性 | 6维度初始值,均为0; |
2 | Dictionary<string, string> descript = new Dictionary<string, string>() | 属性 | 用于选项代码与唯度对应的字典 |
3 | Dictionary<string, int> dpct = new Dictionary<string, int>(); | 属性 | 存储每题答案对应的计算得分 |
4 | string key1=""; | 方法 | 接收用户的答案组合字符串 |
5 | public string countScrore() | 方法 | 计算各维度变量的得分 |
DPCT类实现代码
完整的DPCT类示例代码如下:
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 核心方法取出每一个答案选项字母,根据代码与维度对应关系,取出要计算值的变量名称字符串,然后通过GetField方法查找到变量,并根据模型添加分值。
其基本设计如下图所示:
调用 GetField 方法 得到 FieldInfo 对象,然后 FieldInfo 对象再执行 SetValue 和 GetValue 方法执行增加值操作。
小结
到此这篇关于C# GetField方法的应用实例讲解的文章就介绍到这了,更多相关C# GetField方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!