C# GetField 方法应用实例

简介: 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 方法执行增加值操作。

小结

GetField 方法的更多详情介绍,可参考如下链接:

https://learn.microsoft.com/zh-cn/dotnet/api/system.type.getfield?view=net-8.0

类代码在这里仅做为 GetField 方法实例讲解参考,不做为实际的测评数据和测评效果。

感谢您的阅读,希望本文能够对您有所帮助。

相关文章
|
6天前
|
C#
C#||应用框体设计计算器
C#||应用框体设计计算器
|
2天前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
11 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
24天前
|
存储 监控 C#
在上网行为管理软件中实现C#的跨平台应用
本文介绍了使用C#实现跨平台上网行为管理应用的方法。首先,通过.NET Core SDK创建多操作系统兼容的开发环境。接着,利用HttpClient捕获和记录HTTP请求,示例代码展示了如何捕获请求URL。然后,使用SQLite存储网络行为数据,并提供了创建数据库和插入数据的代码。此外,还讨论了如何跨平台编译应用程序以及如何自动将数据提交到远程服务器。通过这些步骤,可以构建一个能在不同操作系统上运行的上网行为管理系统。
94 3
|
1月前
|
存储 运维 BI
基于C#-VC-MSSQL开发的全套PACS系统源码 3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
PACS的功能价值在于通过连接不同的影像设备,存储与管理图像,图像的调用与后处理,实现资源共享,降低成本,达到提高工作效率、提升医疗水平的目地;
27 1
基于C#-VC-MSSQL开发的全套PACS系统源码  3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
|
1月前
|
程序员 C#
C#抽象类和抽象方法详解
C#抽象类和抽象方法详解
13 0
|
1月前
|
SQL 开发框架 .NET
C#linq表达式的应用
C#linq表达式的应用
12 0
|
1月前
|
存储 开发框架 .NET
C#中将DataTable转化成ListT的方法解析
C#中将DataTable转化成ListT的方法解析
16 0
|
1月前
|
数据采集 前端开发 数据挖掘
Fizzler库+C#:从微博抓取热点的最简单方法
本文介绍如何使用Fizzler库和C#构建微博热点信息爬虫。通过Fizzler的CSS选择器定位关键信息,提取热点标题和排名,实现微博内容的智能挖掘。示例代码展示单线程和多线程采集方法,并涉及代理IP使用。
Fizzler库+C#:从微博抓取热点的最简单方法
|
1月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
1月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。