我有一个X类,这个类有一个事件:EventX。
我有一个B类,我将objectX的事件EventX注册到B类的事件处理程序HandlerB。
X objectX = X.GetStaticObject();
objectX.EventX += HandlerB;
如何检查objectX的EventX包含的事件处理程序HandlerB。感谢。
注意: objectX是一个静态全局事件,可以从任何具有非对象B的对象的任何地方注册该事件。
答案 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
部分,否则这样做。)