是否有一种方法可以判断事件处理程序是否已添加到对象?我正在序列化一个对象列表进入/退出会话状态,这样我们就可以使用基于SQL的会话状态…当列表中的对象发生属性更改时,需要标记它,这是事件处理程序之前适当处理的。但是现在当对象被反序列化时,它不会得到事件处理程序。
出于些许烦恼,我只是将事件处理程序添加到访问对象的Get属性中。它现在被调用了,这很好,除了它被调用了5次所以我认为每次对象被访问时处理程序都会被添加。
忽略它确实足够安全,但我宁愿通过检查是否已经添加了处理程序来使它更干净,因此我只这样做一次。
这可能吗?
编辑:我没有必要完全控制添加什么事件处理程序,所以仅仅检查null是不够的。
正如@Telos提到的,在定义类之外,只能在a +=或a -=的左侧使用EventHandler。因此,如果能够修改定义类,则可以提供一个方法来执行检查,检查事件处理程序是否为空——如果为空,则没有添加事件处理程序。如果不是,那么你可以循环其中的值
Delegate.GetInvocationList。如果一个等于你想要添加为事件处理程序的委托,那么你就知道它在那里。
public bool IsEventHandlerRegistered(Delegate prospectiveHandler)
{
if ( this.EventHandler != null )
{
foreach ( Delegate existingHandler in this.EventHandler.GetInvocationList() )
{
if ( existingHandler == prospectiveHandler )
{
return true;
}
}
}
return false;
}
这可以很容易地修改为“如果它不存在,则添加处理程序”。如果您无法访问公开事件的类的内部结构,则可能需要像@Lou Franco所建议的那样探索-=和+=。
但是,您最好重新检查您调试和退役这些对象的方式,看看您是否不能自己找到跟踪这些信息的方法。