C# FieldInfo
时间: 2025-05-14 19:56:25 浏览: 4
### C# 中 `FieldInfo` 类的用法
在 C# 的反射机制中,`FieldInfo` 是一个非常重要的类,它提供了关于字段的信息以及对字段的操作能力。通过 `FieldInfo` 可以获取字段的名称、类型、修饰符等元数据,并可以动态地读取或设置字段的值。
以下是有关 `FieldInfo` 使用的一些核心概念和示例:
#### 获取 `FieldInfo` 对象
可以通过调用 `Type.GetField(string name)` 方法来获得指定字段的 `FieldInfo` 实例。此方法需要提供字段名作为参数[^1]。
```csharp
using System;
using System.Reflection;
public class ExampleClass
{
public int PublicField = 42;
}
public class Program
{
public static void Main()
{
Type type = typeof(ExampleClass);
FieldInfo field = type.GetField("PublicField", BindingFlags.Public | BindingFlags.Instance);
Console.WriteLine(field.Name); // 输出字段名称
Console.WriteLine(field.FieldType); // 输出字段类型
}
}
```
上述代码展示了如何通过 `GetField()` 方法获取公共实例字段的相关信息。
---
#### 动态访问字段值
一旦获得了 `FieldInfo` 对象,就可以使用其 `GetValue(object obj)` 和 `SetValue(object obj, object value)` 方法分别读取和修改对象上的字段值[^2]。
```csharp
using System;
using System.Reflection;
public class ExampleClass
{
public int PublicField = 42;
}
public class Program
{
public static void Main()
{
ExampleClass instance = new ExampleClass();
Type type = typeof(ExampleClass);
FieldInfo field = type.GetField("PublicField", BindingFlags.Public | BindingFlags.Instance);
// 访问字段值
Console.WriteLine($"Original Value: {field.GetValue(instance)}");
// 修改字段值
field.SetValue(instance, 99);
Console.WriteLine($"Modified Value: {field.GetValue(instance)}");
}
}
```
这段代码演示了如何利用反射技术动态操作字段值。
---
#### 处理私有字段
如果目标字段是非公开的,则需要额外传递合适的绑定标志位(BindingFlags),例如 `BindingFlags.NonPublic | BindingFlags.Instance` 来检索私有字段。
```csharp
using System;
using System.Reflection;
public class ExampleClass
{
private string PrivateField = "Secret";
}
public class Program
{
public static void Main()
{
ExampleClass instance = new ExampleClass();
Type type = typeof(ExampleClass);
FieldInfo field = type.GetField("PrivateField", BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine($"Private Field Value: {field.GetValue(instance)}"); // 输出 Secret
}
}
```
这里说明了即使字段被声明为 `private`,也可以借助反射手段对其进行访问。
---
#### 结合属性特性 (`Attributes`) 使用
除了基本功能外,在某些场景下可能还需要结合自定义特性和其他元编程工具一起工作。比如验证某个字段是否存在特定标记或者执行条件逻辑时会涉及此类需求[^3]。
假设我们有一个简单的日志记录器特性 `[Loggable]` 并希望仅针对带有该标签的目标实施特殊处理:
```csharp
using System;
using System.Linq;
using System.Reflection;
[AttributeUsage(AttributeTargets.Field)]
public class LoggableAttribute : Attribute {}
public class DataModel
{
[Loggable]
public string ImportantData = "This is important";
public string RegularData = "Just normal data";
}
public class Logger
{
public static void LogFields<T>(T obj)
{
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (var field in fields.Where(f => f.IsDefined(typeof(LoggableAttribute), false)))
{
Console.WriteLine($"{field.Name}: {field.GetValue(obj)}");
}
}
}
public class Program
{
public static void Main()
{
DataModel model = new DataModel();
Logger.LogFields(model); // Output: ImportantData: This is important
}
}
```
以上例子进一步扩展了基础应用范围至更复杂的实际项目环境之中。
---
阅读全文
相关推荐


















