有没有办法判断事件处理程序是否已添加到对象?我正在将一个对象列表序列化为会话状态或从会话状态中退出,以便我们可以使用基于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所建议。
但是,最好重新检查一下调试和停用这些对象的方式,以查看是否找不到自己跟踪这些信息的方法。