如何检查事件处理程序是否已注册

本文关键字:程序 是否 注册 事件处理 何检查 检查 | 更新日期: 2023-09-27 18:01:51

我有一个类X,这个类有一个事件:EventX。

我有一个类B,我将objectX的事件EventX注册到类B的事件处理程序HandlerB

X objectX = X.GetStaticObject();
objectX.EventX += HandlerB;

如何检查包含事件处理程序HandlerB的objectX的EventX。谢谢。

注意: objectX是一个静态全局的事件可以从任何地方注册到任何对象,而不是对象b。

如何检查事件处理程序是否已注册

要检查HandlerB是否已注册,您可以使用Delegate.GetInvocationList()方法来获取适当的信息。

编辑:

在V4Vendetta注释之后,我试图编译代码,但失败了。我稍微改了一下。

为了能够进行检查,应该将方法Test添加到X(我假设它是静态的,否则使用this代替X):

public static void Test(Delegate delegateToTest)
{
   if (X.EventX != null)
   {
       foreach (Delegate existingHandler in X.EventX.GetInvocationList())
       {
           if (existingHandler == delegateToTest)
           {
               // registered
           }
       }
    }
}

然后在HandlerB可以访问的地方进行测试:

X.Test(new EventHandler(HandlerB));

如果它不为空,则注册它(尽管它可能带有空处理程序)。

if(objectX.EventX != null)
{
  // registered!
}

据我所知,你不能告诉什么注册了它。如果能够这样做,首先就会破坏事件的意义(解耦代码和双重分派)。

如果您想防止同一事件的事件处理程序被注册两次,您可以在注册它之前删除它-像这样:

objectX.EventX -= HandlerB; 
objectX.EventX += HandlerB;

这可以在注册代码中完成,甚至在事件本身中完成。看一下这个问题的细节。

注意:删除HandlerB不应该失败,即使它之前没有注册!(除非有人在显式事件定义中更改remove部分来这样做。)