有没有办法判断事件处理程序是否已添加到对象中?我正在序列化一个对象列表进入/退出会话状态,这样我们就可以使用基于 SQL 的会话状态......当列表中的一个对象的属性发生更改时,它需要被标记,事件处理程序之前会妥善处理. 但是现在当对象被反序列化时,它没有得到事件处理程序。
有点恼火的是,我只是将事件处理程序添加到访问对象的 Get 属性中。它现在被调用了,这很好,除了它被调用了 5 次,所以我认为每次访问对象时处理程序都会不断添加。
忽略它真的足够安全,但我宁愿通过检查处理程序是否已经添加来让它更干净,所以我只这样做一次。
那可能吗?
编辑:我不一定完全控制添加了哪些事件处理程序,因此仅检查 null 是不够的。
+=正如@Telos 所提到的,从定义类之外,您只能在 a或 a的左侧使用 EventHandler -=。因此,如果您有能力修改定义类,您可以提供一种方法来通过检查事件处理程序是否是来执行检查null- 如果是,则没有添加事件处理程序。如果没有,那么也许你可以遍历 Delegate.GetInvocationList中的值。如果一个等于您要添加为事件处理程序的委托,那么您知道它就在那里。
+=
-=
null
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 的建议探索-=and 。+=
但是,您最好重新检查调试和停用这些对象的方式,看看您是否找不到自己跟踪这些信息的方法。