如何通过反射获取公共静态事件的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
相关产品推荐
相关产品推荐

