如何检查事件处理程序是否已注册
本文关键字:程序 是否 注册 事件处理 何检查 检查 | 更新日期: 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
部分来这样做。)