有没有办法判断是否已将事件处理程序添加到对象中?我正在将对象列表序列化为进入/退出会话状态,因此我们可以使用基于SQL的会话状态...当列表中的对象更改了属性时,需要对其进行标记,事件处理程序在此之前正确处理.但是现在当对象被反序列化时,它没有得到事件处理程序.
在轻微的烦恼中,我刚刚将事件处理程序添加到访问该对象的Get属性中.它现在被调用,这很好,除了它被调用5次,所以我认为处理程序只是在每次访问对象时都会被添加.
它真的很安全,只是忽略,但我宁愿通过检查处理程序是否已被添加来使它更清洁,所以我只这样做了一次.
那可能吗?
编辑:我不一定完全控制添加什么事件处理程序,所以只检查null是不够的.
如果我在运行时分配事件处理程序并且它位于可以多次调用的位置,那么建议的做法是防止同一处理程序多次分配给同一事件.
object.Event += MyFunction
Run Code Online (Sandbox Code Playgroud)
在一个将被多次调用的位置添加它将执行处理程序'n'次(当然).
在尝试添加via之前,我已经尝试删除任何先前的处理程序
object.Event -= MyFunction;
object.Event += MyFunction;
Run Code Online (Sandbox Code Playgroud)
这可行,但似乎不知何故.有关正确处理的任何建议;)此方案.
我想确保我只在特定的类中为一个实例上的事件订阅一次.
例如,我希望能够做到以下几点:
if (*not already subscribed*)
{
member.Event += new MemeberClass.Delegate(handler);
}
Run Code Online (Sandbox Code Playgroud)
我该如何实施这样的警卫?
避免重复注册事件处理程序基本上有两种模式:(根据此讨论:C#模式防止事件处理程序挂钩两次)
使用System.Linq命名空间,并通过调用检查事件处理程序是否已注册 GetInvocationList().Contains(MyEventHandlerMethod);
在注册之前取消注册,如下所示:
MyEvent -= MyEventHandlerMethod;
MyEvent += MyEventHandlerMethod;
Run Code Online (Sandbox Code Playgroud)我的问题是,性能方面,哪一个更好,或者它们在性能上有显着差异?
在以下情况SelectedIndexChanged下,从组合框中在我的应用程序中触发该事件:
SelectedItem以反映组合框现在显示不同对象的属性.我SelectedIndexChanged对案例1 的事件感兴趣,以便我可以更新当前对象的属性.但在案例2中,我不希望事件触发,因为对象的属性没有改变.
一个例子可能有帮助.让我们考虑一下,我有一个包含人员列表的列表框,我有一个组合框,表示列表中当前所选人员的国籍.如果当前在列表中选择了Fred,则可能发生情况1,并且我使用组合框将他的国籍从英语更改为威尔士语.如果我在列表中选择苏格兰人Bob,则可能发生案例2.在这里,我的列表更新事件处理程序代码看到Bob现在被选中,并更新组合框,以便苏格兰语现在是所选项目.这导致组合框的SelectedIndexChanged事件被触发以将Bob的国籍设置为苏格兰语,尽管它已经是苏格兰人.
如何在SelectedItem不导致SelectedIndexChanged事件触发的情况下更新我的组合框的属性?一种方法是取消注册事件处理程序,设置SelectedItem,然后重新注册事件处理程序,但这似乎很乏味且容易出错.肯定有更好的办法.