BindingFlags说明

本文详细介绍了BindingFlags枚举的各个标志及其用途,包括如何通过这些标志来定位特定类型的成员(如公共或私有成员),以及如何调用不同类型的成员(如构造函数、方法等)。同时还解释了如何使用这些标志来定制搜索行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。

指定 BindingFlags.Public 可在搜索中包含公共成员。

指定 BindingFlags.NonPublic 可在搜索中包含非公共成员(即私有成员和受保护的成员)。

指定 BindingFlags.FlattenHierarchy 可包含层次结构上的静态成员。

下列 BindingFlags 修饰符标志可用于更改搜索的执行方式:

BindingFlags.IgnoreCase,表示忽略 name 的大小写。

BindingFlags.DeclaredOnly,仅搜索 Type 上声明的成员,而不搜索被简单继承的成员。

可以使用下列 BindingFlags 调用标志表示要对成员采取的操作:

CreateInstance,表示调用构造函数。忽略 name。对其他调用标志无效。

InvokeMethod,表示调用方法,而不调用构造函数或类型初始值设定项。对 SetField 或 SetProperty 无效。

GetField,表示获取字段值。对 SetField 无效。

SetField,表示设置字段值。对 GetField 无效。

GetProperty,表示获取属性。对 SetProperty 无效。

SetProperty 表示设置属性。对 GetProperty 无效。

 

BindingFlags.Instance                     : 对象实例
BindingFlags.Static                          : 静态成员
BindingFlags.Public                         : 指可在搜索中包含公共成员
BindingFlags.NonPublic                 : 指可在搜索中包含非公共成员(即私有成员和受保护的成员)
BindingFlags.FlattenHierarchy      : 指可包含层次结构上的静态成员
BindingFlags.IgnoreCase               : 表示忽略 name 的大小写
BindingFlags.DeclaredOnly           : 仅搜索 Type 上声明的成员,而不搜索被简单继承的成员
BindingFlags.CreateInstance        : 表示调用构造函数。忽略 name。对其他调用标志无效

### 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 } } ``` 以上例子进一步扩展了基础应用范围至更复杂的实际项目环境之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值