以下是 BindingFlags 各枚举值的详细作用与示例代码。
筛选类:控制查找范围
Instance
- 作用 :在搜索中包含实例成员。在大多数查找场景中,必须 与
Public或NonPublic同时使用,否则可能返回空结果。 - 示例:
csharp
// 查找所有公共实例方法
var methods = typeof(MyClass).GetMethods(BindingFlags.Public | BindingFlags.Instance);
Static
- 作用:在搜索中包含静态成员。同样需要与可见性标志组合使用。
- 示例:
csharp
// 查找所有非公共静态字段
var fields = typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Static);
Public
- 作用:在搜索中包含公共成员。
- 示例:
csharp
// 获取所有公共成员(含实例与静态)
var members = typeof(MyClass).GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
NonPublic
- 作用 :在搜索中包含非公共成员(
private、protected、internal)。注意,即使通过InternalsVisibleTo可见,反射查找internal成员时仍需使用此标志。 - 示例:
csharp
// 查找私有实例字段
var privateFields = typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
DeclaredOnly
- 作用:仅查找当前类型自身声明的成员,排除从基类继承的成员。
- 示例:
csharp
// 仅获取 MyClass 自己声明的方法,不含 object 继承的 ToString 等
var ownMethods = typeof(MyClass).GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
FlattenHierarchy
- 作用 :在查找静态成员时,沿继承链向上收集公共和受保护的静态成员。不包含私有静态成员,也不包含嵌套类型。对实例成员无效。
- 示例:
csharp
// 获取当前类及基类中所有 public/protected 静态字段
var staticFields = typeof(Derived).GetFields(
BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
IgnoreCase
- 作用:按名称查找成员时忽略大小写。
- 示例:
csharp
// 方法实际名为 "PrintName",忽略大小写也能找到
var method = typeof(MyClass).GetMethod("printname", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
Default
- 作用 :值为
0,表示未指定任何标志。本身不产生筛选效果,仅作为占位符。
操作类:配合 InvokeMember 使用
InvokeMethod
- 作用:指示要调用一个方法(不能用于构造函数或类型初始化器)。
- 示例:
csharp
typeof(MyClass).InvokeMember("DoWork",
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null, instance, null);
CreateInstance
- 作用 :指示要调用构造函数创建实例。此时成员名称参数被忽略。若未指定查找类型,默认按
Instance | Public处理。 - 示例:
csharp
var obj = typeof(MyClass).InvokeMember("",
BindingFlags.CreateInstance | BindingFlags.Public | BindingFlags.Instance,
null, null, new object[] { "参数" });
GetField / SetField
- 作用:分别指示获取或设置字段的值。
- 示例:
csharp
// 获取字段值
var val = type.InvokeMember("Name", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, obj, null);
// 设置字段值
type.InvokeMember("Name", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { "新值" });
GetProperty / SetProperty
- 作用:分别指示获取或设置属性的值。
- 示例:
csharp
// 获取属性值
var propVal = type.InvokeMember("Value", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, obj, null);
// 设置属性值
type.InvokeMember("Value", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { 100 });
特殊场景与 COM 互操作
ExactBinding
- 作用 :要求传入参数的类型与形参类型精确匹配 ,不允许默认绑定器进行拓宽转换。默认绑定器实际会忽略此标志,主要供自定义
Binder使用。
OptionalParamBinding
- 作用 :返回参数个数与传入参数个数匹配的成员。用于处理带默认值参数或可变参数(varargs)的方法,仅应配合
InvokeMember使用。
IgnoreReturn
- 作用:在 COM 互操作中,指定可以忽略成员的返回值。
PutDispProperty
- 作用 :调用 COM 对象上的
PROPPUT成员。当属性同时具有PROPPUT和PROPPUTREF时,用于明确区分调用按值设置的那个。
PutRefDispProperty
- 作用 :调用 COM 对象上的
PROPPUTREF成员,即按引用设置属性值。
关键提醒
查找成员时,必须至少指定 Instance 或 Static 之一 ,否则 GetMethods、GetFields 等方法通常不会返回结果。这是反射初学者最容易忽略的规则之一。
了解更多
System.Windows.Controls 命名空间 | Microsoft Learn
控件库 - WPF .NET Framework | Microsoft Learn
使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn
HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频