我有一个有活动的课程:
public event MyEventHandler MyEvent;
有没有办法获取正在收听此事件的对象集合(通过反射或其他方式)?
编辑 - 嗯,抱歉移动球门柱 - 我需要能够使用反射bc执行此操作我有一个表示事件名称的字符串值,而我需要找到听众。我看不到使用反射...
访问GetInvocationList属性的明显方法谢谢!
答案 0 :(得分:4)
List<object> targets = MyEvent.GetInvocationList().Select(d => d.Target).ToList();
不幸的是,通过反射这样做会有些模糊,甚至可能,因为这句语法:
public event EventHandler MyEvent;
...
MyEvent(this, EventArgs.Empty);
是语法糖。这实际上是做什么的:
private EventHandler compilerGeneratedName;
public event EventHandler MyEvent
{
add { compilerGeneratedName += value; }
remove { compilerGeneratedName -= value; }
}
...
compilerGeneratedName(this, EventArgs.Empty);
换句话说,事件总是有声明性的简写,即最近收到的属性。因此,为了获得调用列表,您必须检查由编译器命名的私有变量(当然,除非您自己使用简写语法并且知道实例变量的名称。)
没有直接的方法将外部公开的event
构造与支持处理程序相关联,而不是直接将property
绑定到支持变量:即因为那里不一定是一对一的关系。很可能存在,但通常情况并非如此。
您可以尝试使用反射来检查声明事件的类型上具有正确EventHandler<>
类型的私有变量(请注意,您必须在特定类型中执行此操作声明事件, not 在子类上)并查看是否可以确定与名称的某种相关性,但这将是一个不可靠的解决方案。
答案 1 :(得分:0)
MulticastDelegate.GetInvocationList()