2011-07-13 51 views
2

我有一个类X,并且此类有一个事件:EventX。如何检查事件处理程序已注册

而且我有一个类B,我注册_对象的事件EventX到

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

如何检查_对象的EventX包含事件处理HandlerB B类的事件处理程序HandlerB。谢谢。

注: _对象是一个静态全局哪些事件可以从任何地方登记。如果不为空,则注册这些不反对B.

回答

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

你可以为事件做这件事吗? – V4Vendetta

+0

@ V4Vendetta:你说得对。我没有在VS中检查它,并完全忘记它可能会导致错误。不过,我编辑了代码以使其工作。 – msergey

3

任何对象(虽然它可能是一个空处理程序)。

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

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

+0

但是,它可以从任何地方注册,因为objectX是全局对象(静态)。谢谢。 –

+0

我添加更多信息。请帮帮我。谢谢。 –

0

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

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

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

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

相关问题