小编典典

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

c#

有没有办法判断事件处理程序是否已添加到对象?我正在将一个对象列表序列化为会话状态或从会话状态中退出,以便我们可以使用基于SQL的会话状态…当列表中的对象的属性发生更改时,需要对其进行标记,事件处理程序会在此之前对其进行适当的处​​理。但是,现在当对象反序列化时,它没有获取事件处理程序。

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

只需忽略它就足够安全了,但是我宁愿通过检查是否已经添加了处理程序来使其变得更加整洁,所以我只这样做一次。

那可能吗?

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


阅读 269

收藏
2020-05-19

共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所建议。

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

2020-05-19