检查事件是否已注册

6

如果我采用经典的方式注册和注销事件(+= -=),那么有没有一种方法可以查看当前是否已经注册了某个事件?

假设我有两种方法可以在一个计时器上进行注册。如果已经在 .Elapsed 上注册了某些内容,我不希望其他任何内容注册(也不希望重复注册)。

有没有办法查找当前注册到特定事件的方法?


1
你是指在运行时还是在编码时? - Steve B
3
请参考:https://dev59.com/HHVC5IYBdhLWcg3w9GE9该链接讨论了一个问题: "事件处理程序是否已经添加?" - Dejo
在计时器类之外的运行时。@dejo 谢谢,我没有使用正确的搜索短语,因此没有找到那篇文章。但我仍然很好奇它是否也适用于扩展方法类型(如下面 Joel 的帖子)。 - Offler
2个回答

5
如果你真的想要这样的行为,我认为最好的选择是使用事件的重载add{}和remove{}功能。
public class Foo
{

   private EventHandler<ElapsedEventArgs> _elapsed;

   public EventHandler<ElapsedEventArgs> Elapsed
   {
       add
       {
           if( _elapsed == null )
               _elapsed += value;
           else
               throw new InvalidOperationException ("There is already an eventhandler attached to the Elapsed event.");
       }
       remove
       {
           _elapsed -= value;
       }
   }

}

4
是的,但将其转化为NOP是有争议的。抛出可能更合适。 - H H
这对我来说是一个与GetInvocationList()一起的解决方案。 - Offler

1
您可以使用 GetInvocationList() 并依次获取计数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接