当前位置: 首页 > article >正文

c#————FieldInfo的基础使用

FieldInfo 是 C# 反射(Reflection)机制中的一个重要类,用于获取有关字段的信息。通过 FieldInfo,你可以在运行时动态地获取或设置字段的值、获取字段的属性等等。下面列出了一些常用的 FieldInfo API,并给出了相应的代码示例。

常用 API

  1. FieldInfo.GetValue(object obj):获取字段的值。
  2. FieldInfo.SetValue(object obj, object value):设置字段的值。
  3. FieldInfo.FieldType:获取字段的类型。
  4. FieldInfo.IsStatic:判断字段是否是静态的。
  5. FieldInfo.IsPublic:判断字段是否是公共的。
  6. FieldInfo.Name:获取字段的名称。

示例代码

首先,定义一个示例类:

public class Person  
{  
    public string Name;  
    private int age;  
    public static string Nationality = "Unknown";  
  
    public int Age   
    {   
        get { return age; }   
        set { age = value; }   
    }  
}

接下来,使用 FieldInfo 来获取和设置字段的值:

using System;  
using System.Reflection;  
  
class Program  
{  
    static void Main()  
    {  
        // 获取类型  
        Type personType = typeof(Person);  
  
        // 获取公共字段的信息  
        FieldInfo nameField = personType.GetField("Name");  
        Console.WriteLine($"Name field: {nameField.Name}, Type: {nameField.FieldType}");  
  
        // 获取私有字段的信息  
        FieldInfo ageField = personType.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);  
        Console.WriteLine($"Age field: {ageField.Name}, Type: {ageField.FieldType}");  
  
        // 获取静态字段的信息  
        FieldInfo nationalityField = personType.GetField("Nationality");  
        Console.WriteLine($"Nationality field: {nationalityField.Name}, Type: {nationalityField.FieldType}");  
  
        // 创建一个Person对象  
        Person person = new Person();  
  
        // 设置字段的值  
        nameField.SetValue(person, "John Doe");  
        ageField.SetValue(person, 30);  
        nationalityField.SetValue(null, "American");  
  
        // 获取字段的值  
        string nameValue = (string)nameField.GetValue(person);  
        int ageValue = (int)ageField.GetValue(person);  
        string nationalityValue = (string)nationalityField.GetValue(null);  
  
        // 输出字段的值  
        Console.WriteLine($"Name: {nameValue}");  
        Console.WriteLine($"Age: {ageValue}");  
        Console.WriteLine($"Nationality: {nationalityValue}");  
  
        // 检查字段属性  
        Console.WriteLine($"Is Name public? {nameField.IsPublic}");  
        Console.WriteLine($"Is Age static? {ageField.IsStatic}");  
        Console.WriteLine($"Is Nationality static? {nationalityField.IsStatic}");  
    }  
}

输出

Name field: Name, Type: System.String
Age field: age, Type: System.Int32
Nationality field: Nationality, Type: System.String
Name: John Doe
Age: 30
Nationality: American
Is Name public? True
Is Age static? False
Is Nationality static? True

 接下来我们来看看一个常用的 api FieldInfo.SetValue(object obj, object value)

FieldInfo.SetValue(object obj, object value) 是反射(Reflection)中的一个方法,用于在运行时设置某个字段的值。在这个方法签名中:

  • obj 参数表示包含要设置的字段的对象实例。这个对象通常是引用类型或值类型的实例。
  • value 参数表示要设置的新值,它将被转换为字段的类型。

obj 参数可以是任何类型的实例,包括但不限于以下几种常见类型:

  1. 引用类型
    • 类(class)的实例,例如:PersonList<int>Dictionary<string, string> 等等。
    • 数组,例如:int[]string[]
    • 接口类型的实例。
    • 委托(delegate)和事件(event)。
  2. 值类型
    • 结构体(struct)的实例,例如:DateTimePoint
    • 枚举(enum)的实例。
    • 基本数据类型,例如:intfloatdoublebool 等。
using System;  
using System.Reflection;  
  
public class Person  
{  
    public string Name;  
    public int Age;  
}  
  
class Program  
{  
    static void Main()  
    {  
        Person person = new Person();  
          
        // 获取 Person 类型的 Type 对象  
        Type personType = typeof(Person);  
          
        // 获取 Name 字段的 FieldInfo 对象  
        FieldInfo nameField = personType.GetField("Name");  
          
        // 设置 Name 字段的值  
        nameField.SetValue(person, "John Doe");  
          
        // 获取 Age 字段的 FieldInfo 对象  
        FieldInfo ageField = personType.GetField("Age");  
          
        // 设置 Age 字段的值  
        ageField.SetValue(person, 30);  
          
        // 输出结果  
        Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");  
    }  
}

说明

  • GetField 方法用于获取字段信息。如果字段是私有的,需要使用 BindingFlags.NonPublic | BindingFlags.Instance
  • GetValue 和 SetValue 方法用于获取和设置字段的值。对于静态字段,SetValue 和 GetValue 方法的第一个参数应为 null
  • 字段属性 如 IsPublic 和 IsStatic 可以用来检查字段的特性。

通过这些 API,你可以在运行时动态地操作对象的字段,非常灵活。

 

 

 


http://www.kler.cn/news/364772.html

相关文章:

  • 接口测试(九)jmeter——关联(JSON提取器)
  • 格姗知识圈博客网站开源了!
  • 【记录】VSCode|自用设置项
  • 软考(中级-软件设计师)算法分析篇(1024)
  • Postgresql中和时间相关的字段类型及其适用场景
  • ASP.NET MVC-font awesome-localhost可用IIS不可用
  • 鸿蒙网络编程系列33-TLS回声服务器示例
  • 音频编解码器音频文件格式
  • 数字图像处理的概念(二)
  • 基于SpringBoot+Vue+uniapp微信小程序的文玩销售小程序的详细设计和实现
  • 如何使用 Ngrok 将本地服务暴露到公网
  • 企业数字化转型战略深度解析与最佳实践路径:微服务架构与物联网的深度融合
  • python爬虫技术实现酷我付费破解下载
  • 搜维尔科技:Manus新品发布Metagloves Pro专业版,专为高精度需求的客户打造,尤其是人形机器人产业与人机工效研究使用
  • 免费开源!语音识别平台让医疗对话更高效,沟通更准确
  • 【卫星图像处理】卫星光照处理
  • docker 镜像详解
  • filebeat接入nginx和mysql获取日志
  • 【C++】类和对象(附题)
  • 【LeetCode每日一题】——862.和至少为 K 的最短子数组
  • 构建安全基石:网络安全等级保护定级指南
  • 一种用于推进欧洲临床中心中风管理的联邦学习平台即服务
  • 解决xhell连接虚拟机导致小键盘无法使用
  • vue图片加载失败的图片
  • Flink批处理快速入门
  • self-supervised learning(BERT和GPT)