You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取公共静态事件的GetInvocationList委托调用列表

问题原因

C#编译器为event关键字声明的自动实现事件生成的底层委托字段默认是私有类型,哪怕事件本身声明为public,底层存储的委托字段也不会对外公开,所以你使用BindingFlags.Public参数无法检索到对应的字段,自然返回null。

解决方法

调整GetField方法的绑定标志参数,把BindingFlags.Public替换为BindingFlags.NonPublic即可,无需额外添加BindingFlags.FlattenHierarchy参数。

修正后的代码如下:

public class MyClass
{
    public void Test()
    {
        // 调整绑定标志,查找私有静态字段
        FieldInfo fieldInfo = typeof(Business).GetField("MyEvent", BindingFlags.Static | BindingFlags.NonPublic);
        Delegate del = (Delegate)fieldInfo.GetValue(null);
        var list = del.GetInvocationList();
        // 可通过list.Count判断是否绑定了处理程序
    }
}
注意事项
  • 该方案仅适用于自动实现的事件,也就是你没有手动编写add/remove事件访问器的场景。如果自定义了事件访问器,底层存储委托的字段名可能和事件名不一致,需要根据实际实现调整查找的字段名。
  • 反射访问私有成员属于依赖编译器实现的行为,不同版本的C#编译器、不同.NET运行时实现可能存在差异,生产环境使用前需要做好兼容性验证。

内容的提问来源于stack exchange,提问作者Dark_Knight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:06:04