【笔记】C# 中BindingFlags的详细作用

以下是 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 等方法通常不会返回结果。这是反射初学者最容易忽略的规则之一。

了解更多

BindingFlags 枚举

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

相关推荐
?abc!1 小时前
(贪心)621. 任务调度器
java·前端·c#
AI视觉网奇1 小时前
turtle 入门教程笔记
笔记
跨知易知识产权2 小时前
美国专利确权是什么,和专利诉讼有什么不一样?
笔记
杨逢昌工厂6S管理2 小时前
126-杨逢昌6S三环体系:越做越乱的现场熵增机理与基准化治理——一线现场诊断笔记
经验分享·笔记·职场和发展·学习方法
悟道书生2 小时前
若依 RBAC 权限控制学习笔记
java·网络·笔记·sql·学习·vue
陈哈哈11113 小时前
折腾了半天,总算把 Vim 9.2 装明白了
笔记
陈哈哈11113 小时前
折腾了半天,总算把 OpenGL 的开发环境给装明白了
笔记
深圳老胡4 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节
正弦波_Wave4 小时前
【Orcad原理图打印Pdf】
笔记·pdf