小编典典

是否已经添加了事件处理程序?

all

有没有办法判断事件处理程序是否已添加到对象中?我正在序列化一个对象列表进入/退出会话状态,这样我们就可以使用基于 SQL
的会话状态......当列表中的一个对象的属性发生更改时,它需要被标记,事件处理程序之前会妥善处理. 但是现在当对象被反序列化时,它没有得到事件处理程序。

有点恼火的是,我只是将事件处理程序添加到访问对象的 Get 属性中。它现在被调用了,这很好,除了它被调用了 5
次,所以我认为每次访问对象时处理程序都会不断添加。

忽略它真的足够安全,但我宁愿通过检查处理程序是否已经添加来让它更干净,所以我只这样做一次。

那可能吗?

编辑:我不一定完全控制添加了哪些事件处理程序,因此仅检查 null 是不够的。


阅读 88

收藏
2022-06-28

共1个答案

小编典典

+=正如@Telos 所提到的,从定义类之外,您只能在 a或 a的左侧使用 EventHandler
-=。因此,如果您有能力修改定义类,您可以提供一种方法来通过检查事件处理程序是否是来执行检查null-
如果是,则没有添加事件处理程序。如果没有,那么也许你可以遍历
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 的建议探索-=and
+=

但是,您最好重新检查调试和停用这些对象的方式,看看您是否找不到自己跟踪这些信息的方法。

2022-06-28