c#————FieldInfo的基础使用
FieldInfo
是 C# 反射(Reflection)机制中的一个重要类,用于获取有关字段的信息。通过 FieldInfo
,你可以在运行时动态地获取或设置字段的值、获取字段的属性等等。下面列出了一些常用的 FieldInfo
API,并给出了相应的代码示例。
常用 API
FieldInfo.GetValue(object obj)
:获取字段的值。FieldInfo.SetValue(object obj, object value)
:设置字段的值。FieldInfo.FieldType
:获取字段的类型。FieldInfo.IsStatic
:判断字段是否是静态的。FieldInfo.IsPublic
:判断字段是否是公共的。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
参数可以是任何类型的实例,包括但不限于以下几种常见类型:
- 引用类型:
- 类(class)的实例,例如:
Person
、List<int>
、Dictionary<string, string>
等等。 - 数组,例如:
int[]
、string[]
。 - 接口类型的实例。
- 委托(delegate)和事件(event)。
- 类(class)的实例,例如:
- 值类型:
- 结构体(struct)的实例,例如:
DateTime
、Point
。 - 枚举(enum)的实例。
- 基本数据类型,例如:
int
、float
、double
、bool
等。
- 结构体(struct)的实例,例如:
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,你可以在运行时动态地操作对象的字段,非常灵活。