![](/img/trans.png)
[英]Which is the better structure, passing an event handler as an arg, or listening to the event firing?
[英]How to find which objects are listening to my event?
我有一堂课有一个活动:
public event MyEventHandler MyEvent;
有什么方法可以处理正在侦听此事件的对象集合(通过反射或其他方式)?
编辑 -嗯,很抱歉移动球门柱-我需要能够使用反射bc做到这一点。我有一个表示事件名称的字符串值,我需要找到听众。 我看不到使用反射访问GetInvocationList属性的明显方法。
谢谢!
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);
换句话说,事件始终具有声明性的简写,即属性仅在最近才收到。 结果,为了获得调用列表,您必须检查由编译器命名的私有变量(当然,除非您自己使用longhand语法并知道实例变量的名称)。
除了将property
绑定到后备变量的直接方法外,没有其他方法可以将外部公开的event
构造与后备处理程序相关联:即因为不一定存在一对一的关系 。 很有可能存在,但通常不必一定那样。
您可以尝试使用反射来检查声明事件的类型上具有适当EventHandler<>
类型的私有变量(请注意,您必须在声明事件的特定类型上进行此操作, 而不是在子类上进行)并查看是否可以确定与名称的某种关联,但这充其量是不可靠的解决方案。
MulticastDelegate.GetInvocationList()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.