我有一个类X,并且此类有一个事件:EventX。如何检查事件处理程序已注册
而且我有一个类B,我注册_对象的事件EventX到
X objectX = X.GetStaticObject();
objectX.EventX += HandlerB;
如何检查_对象的EventX包含事件处理HandlerB B类的事件处理程序HandlerB。谢谢。
注: _对象是一个静态全局哪些事件可以从任何地方登记。如果不为空,则注册这些不反对B.
我有一个类X,并且此类有一个事件:EventX。如何检查事件处理程序已注册
而且我有一个类B,我注册_对象的事件EventX到
X objectX = X.GetStaticObject();
objectX.EventX += HandlerB;
如何检查_对象的EventX包含事件处理HandlerB B类的事件处理程序HandlerB。谢谢。
注: _对象是一个静态全局哪些事件可以从任何地方登记。如果不为空,则注册这些不反对B.
要检查您的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));
任何对象(虽然它可能是一个空处理程序)。
if(objectX.EventX != null)
{
// registered!
}
据我所知,你不能告诉什么用它注册。能够首先击败事件点(解耦代码和双重调度)。
但是,它可以从任何地方注册,因为objectX是全局对象(静态)。谢谢。 –
我添加更多信息。请帮帮我。谢谢。 –
如果你想防止同一事件被注册过两次的事件处理程序,你可以在注册之前删除它 - 是这样的:
objectX.EventX -= HandlerB;
objectX.EventX += HandlerB;
这可以在注册码中完成,甚至可以在事件本身完成。有关详细信息,请参阅this question。
注意:删除HandlerB应该不会失败,即使它之前没有注册! (除非有人在显式事件定义中更改了remove
部分)。
你可以为事件做这件事吗? – V4Vendetta
@ V4Vendetta:你说得对。我没有在VS中检查它,并完全忘记它可能会导致错误。不过,我编辑了代码以使其工作。 – msergey