繁体   English   中英

如何查找哪些对象正在监听我的事件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM