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

时间:2011-07-13 08:39:35

标签: c# .net winforms events event-handling

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

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

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

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

注意: objectX是一个静态全局事件,可以从任何具有非对象B的对象的任何地方注册该事件。

3 个答案:

答案 0 :(得分:4)

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

修改

在V4Vendetta评论后,我试图编译代码,但它失败了。我略微改变了它。

为了能够进行检查,方法测试应该添加到X(我假设它是静态的,否则使用它而不是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));

答案 1 :(得分:3)

如果它不为null,则会注册它(尽管它可能是一个空的处理程序)。

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

据我所知,你无法告诉注册了什么。能够首先击败事件(解耦代码和双重调度)。

答案 2 :(得分:0)

如果您想阻止事件处理程序为同一事件注册两次,您可以在注册之前将其删除 - 如下所示:

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

这可以在注册代码中完成,甚至可以在事件本身中完成。有关详细信息,请查看this question

注意:删除HandlerB不会失败,即使它之前没有注册过! (除非有人更改了显式事件定义中的remove部分,否则这样做。)