我有一个有活动的课程:

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);

换句话说,事件总是有声明性的简写,即最近收到的属性。因此,为了获得调用列表,您必须检查由编译器命名的私有变量(当然,除非您自己使用简写语法并且知道实例变量的名称。)

没有直接的方法将外部公开的event构造与支持处理程序相关联,而不是将property与支持变量联系起来的直接方法:即因为不一定一对一的关系。很可能存在,但通常情况并非如此。

您可以尝试使用反射来检查声明事件类型的正确EventHandler<>类型的私有变量(请注意,您必须在特定类型处执行此操作)声明事件,在子类上)并查看是否可以确定与名称的某种相关性,但这将是一个不可靠的解决方案。

其他提示

MulticastDelegate.GetInvocationList()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top