• C# GetField 方法应用实例


    目录

    关于 C# Type 类

    GetField 方法应用

    应用举例

    心理CT设计题

    类设计

    DPCT类实现代码

    小结


    关于 C# Type 类

    Type表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。调用 this.GetType() 方法得到Type对象,可获取成员信息,如方法名、变量名。更多学习请参照以下链接:

    Type 类 (System) | Microsoft Learn

    本文以数据采集应用实例介绍 Type.GetField 方法的实际应用。

    GetField 方法应用

    GetField 是获取当前 Type 的特定方法,我们在这里介绍 GetField(String, BindingFlags) 即使用指定的绑定约束搜索指定的字段变量。

    其中 string name 表示要搜索的方法名称,System.Reflection.BindingFlags 枚举可见下表:

    序号筛选器标志说明
    1BindingFlags.Instance 或 BindingFlags.Static 必须指定实例或静态方可有效返回
    2BindingFlags.Public搜索当前 Type 中包含的公共方法
    3BindingFlags.NonPublic搜索当前 Type 中包含的非公共方法 、私有方法、内部方法和保护方法
    4BindingFlags.FlattenHierarchy在层次结构中的包括 public 和 protected 静态成员; private 继承类中的静态成员不包括在层次结构中
    5BindingFlags.IgnoreCase忽略方法name的大小写进行搜索
    6BindingFlags.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

    初始化代码如下:

    1. int 轻躁狂=0;
    2. int 妄想狂=0;
    3. int 抑郁=0;
    4. int 癔病=0;
    5. int 疑病=0;
    6. int 精神分裂=0;

    基本的设计如下,通过被测试者对题目的理解,回答其中的选项(单选),则采集后的数据拼接为10个字母组合,如下:

    string key1="BACCEDFABCD";

    其中 key1 字符串即为被测试者的答案。

    建立代码对应维度的字典变量        Dictionary descript = new Dictionary() ,如下代码:

    1. descript.Add("A", "轻躁狂");
    2. descript.Add("B", "妄想狂");
    3. descript.Add("C", "抑郁");
    4. descript.Add("D", "癔病");
    5. descript.Add("E", "疑病");
    6. descript.Add("F", "精神分裂");

    建立 Dictionary dpct = new Dictionary();  字典变量,用于存储模型的运算值(每一题均不同),如下代码:

    1. dpct.Add("A1", 1);
    2. dpct.Add("B1", 1);
    3. dpct.Add("C1", 1);
    4. dpct.Add("D1", 1);
    5. dpct.Add("E1", 1);
    6. dpct.Add("F1", 1);
    7. dpct.Add("A2", 0);
    8. dpct.Add("B2", 0);
    9. dpct.Add("C2", 0);
    10. dpct.Add("D2", 0);
    11. dpct.Add("E2", 0);
    12. dpct.Add("F2", 0);
    13. dpct.Add("A3", 0);
    14. dpct.Add("B3", 1);
    15. dpct.Add("C3", 0);
    16. dpct.Add("D3", 0);
    17. dpct.Add("E3", 0);
    18. dpct.Add("F3", 1);
    19. dpct.Add("A4", 1);
    20. dpct.Add("B4", 0);
    21. dpct.Add("C4", 0);
    22. dpct.Add("D4", 0);
    23. dpct.Add("E4", 1);
    24. dpct.Add("F4", 0);
    25. dpct.Add("A5", 0);
    26. dpct.Add("B5", 1);
    27. dpct.Add("C5", 0);
    28. dpct.Add("D5", 1);
    29. dpct.Add("E5", 1);
    30. dpct.Add("F5", 1);
    31. dpct.Add("A6", 1);
    32. dpct.Add("B6", 1);
    33. dpct.Add("C6", 1);
    34. dpct.Add("D6", 0);
    35. dpct.Add("E6", 1);
    36. dpct.Add("F6", 0);
    37. dpct.Add("A7", 0);
    38. dpct.Add("B7", 0);
    39. dpct.Add("C7", 0);
    40. dpct.Add("D7", 0);
    41. dpct.Add("E7", 1);
    42. dpct.Add("F7", 0);
    43. dpct.Add("A8", 0);
    44. dpct.Add("B8", 1);
    45. dpct.Add("C8", 0);
    46. dpct.Add("D8", 0);
    47. dpct.Add("E8", 0);
    48. dpct.Add("F8", 0);
    49. dpct.Add("A9", 1);
    50. dpct.Add("B9", 1);
    51. dpct.Add("C9", 0);
    52. dpct.Add("D9", 1);
    53. dpct.Add("E9", 1);
    54. dpct.Add("F9", 1);
    55. dpct.Add("A10", 1);
    56. dpct.Add("B10", 1);
    57. dpct.Add("C10", 1);
    58. dpct.Add("D10", 0);
    59. dpct.Add("E10", 1);
    60. dpct.Add("F10", 1);

    类设计

    创建一个 DPCT 类用于计算各维度的得分情况,该类设计如下:

    序号成员类型说明
    1int 轻躁狂=0;
    int 妄想狂=0;
    int 抑郁=0;
    int 癔病=0;
    int 疑病=0;
    int 精神分裂=0;
    属性6维度初始值,均为0;
    2Dictionary descript = new Dictionary()属性用于选项代码与唯度对应的字典
    3Dictionary dpct = new Dictionary(); 属性存储每题答案对应的计算得分
    4string key1="";方法接收用户的答案组合字符串
    5public string countScrore()方法计算各维度变量的得分
    DPCT类实现代码

    完整的DPCT类示例代码如下:

    1. public class DPCT
    2. {
    3. int 轻躁狂=0;
    4. int 妄想狂=0;
    5. int 抑郁=0;
    6. int 癔病=0;
    7. int 疑病=0;
    8. int 精神分裂=0;
    9. public string key1 = "";
    10. Dictionary<string, string> descript = new Dictionary<string, string>();
    11. Dictionary<string, int> dpct = new Dictionary<string, int>();
    12. public DPCT()
    13. {
    14. descript.Add("A", "轻躁狂");
    15. descript.Add("B", "妄想狂");
    16. descript.Add("C", "抑郁");
    17. descript.Add("D", "癔病");
    18. descript.Add("E", "疑病");
    19. descript.Add("F", "精神分裂");
    20. dpct.Add("A1", 1);
    21. dpct.Add("B1", 1);
    22. dpct.Add("C1", 1);
    23. dpct.Add("D1", 1);
    24. dpct.Add("E1", 1);
    25. dpct.Add("F1", 1);
    26. dpct.Add("A2", 0);
    27. dpct.Add("B2", 0);
    28. dpct.Add("C2", 0);
    29. dpct.Add("D2", 0);
    30. dpct.Add("E2", 0);
    31. dpct.Add("F2", 0);
    32. dpct.Add("A3", 0);
    33. dpct.Add("B3", 1);
    34. dpct.Add("C3", 0);
    35. dpct.Add("D3", 0);
    36. dpct.Add("E3", 0);
    37. dpct.Add("F3", 1);
    38. dpct.Add("A4", 1);
    39. dpct.Add("B4", 0);
    40. dpct.Add("C4", 0);
    41. dpct.Add("D4", 0);
    42. dpct.Add("E4", 1);
    43. dpct.Add("F4", 0);
    44. dpct.Add("A5", 0);
    45. dpct.Add("B5", 1);
    46. dpct.Add("C5", 0);
    47. dpct.Add("D5", 1);
    48. dpct.Add("E5", 1);
    49. dpct.Add("F5", 1);
    50. dpct.Add("A6", 1);
    51. dpct.Add("B6", 1);
    52. dpct.Add("C6", 1);
    53. dpct.Add("D6", 0);
    54. dpct.Add("E6", 1);
    55. dpct.Add("F6", 0);
    56. dpct.Add("A7", 0);
    57. dpct.Add("B7", 0);
    58. dpct.Add("C7", 0);
    59. dpct.Add("D7", 0);
    60. dpct.Add("E7", 1);
    61. dpct.Add("F7", 0);
    62. dpct.Add("A8", 0);
    63. dpct.Add("B8", 1);
    64. dpct.Add("C8", 0);
    65. dpct.Add("D8", 0);
    66. dpct.Add("E8", 0);
    67. dpct.Add("F8", 0);
    68. dpct.Add("A9", 1);
    69. dpct.Add("B9", 1);
    70. dpct.Add("C9", 0);
    71. dpct.Add("D9", 1);
    72. dpct.Add("E9", 1);
    73. dpct.Add("F9", 1);
    74. dpct.Add("A10", 1);
    75. dpct.Add("B10", 1);
    76. dpct.Add("C10", 1);
    77. dpct.Add("D10", 0);
    78. dpct.Add("E10", 1);
    79. dpct.Add("F10", 1);
    80. }
    81. public string countScrore()
    82. {
    83. for (int i = 0; i < key1.Length; i++)
    84. {
    85. string anwser = key1.Substring(i, 1);
    86. string varname = descript[anwser];
    87. FieldInfo fi=this.GetType().GetField(varname, BindingFlags.NonPublic| BindingFlags.Instance);
    88. fi.SetValue(this, (int)fi.GetValue(this) + dpct[anwser+(i+1).ToString()]);
    89. }
    90. }
    91. }

    countScore 核心方法取出每一个答案选项字母,根据代码与维度对应关系,取出要计算值的变量名称字符串,然后通过GetField方法查找到变量,并根据模型添加分值。

    其基本设计如下图所示:

    调用 GetField 方法 得到 FieldInfo 对象,然后 FieldInfo 对象再执行 SetValue 和 GetValue 方法执行增加值操作。

    小结

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

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

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

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

  • 相关阅读:
    记录不存在如何加锁MySQL_innodb select for update 没有满足条件的记录的情况下 是怎么加锁的呢
    【数学模拟卷总结】2023李林六套卷数学二第三套
    前端进击笔记第一节 前端基础知识体系
    python特别篇—github基本操作手册
    【嵌入式百科】006——RAM及其分类
    Spring事务实现的方式及底层原理
    vue 使用 driver.js 页面分步引导
    Python:AES+Base64的加密与解密(ECB模式)
    【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone
    NumPy 正态分布与 Seaborn 可视化指南
  • 原文地址:https://blog.csdn.net/michaelline/article/details/138192203