我有2个处理程序使用相同的形式。如何在添加新处理程序(C#)之前删除处理程序?如何取消注册表单事件的所有处理程序?
2
A
回答
10
如果您在窗体本身的工作,你应该能够做这样的事情:
伪代码:
Delegate[] events = Form1.SomeEvent.GetInvokationList();
foreach (Delegate d in events)
{
Form1.SomeEvent -= d;
}
从形式,您SOL之外。
7
如果您知道这些处理程序是什么,只需以与订阅它们相同的方式删除它们,除非使用 - =而不是+ =。
如果你不知道处理程序是什么,你不能删除它们 - 这个想法是事件封装可以防止一个感兴趣的团体在观察事件时阻止另一个类的兴趣。
编辑:我一直假设你正在讨论由不同的类实现的事件,例如,一个控件。如果您的课程“拥有”该事件,那么只需将相关变量设置为空。
2
我意识到这个问题相当古老,但希望它能帮助别人。您可以反省任何类的注销所有事件处理程序。
public static void UnregisterAllEvents(object objectWithEvents)
{
Type theType = objectWithEvents.GetType();
//Even though the events are public, the FieldInfo associated with them is private
foreach (System.Reflection.FieldInfo field in theType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance))
{
//eventInfo will be null if this is a normal field and not an event.
System.Reflection.EventInfo eventInfo = theType.GetEvent(field.Name);
if (eventInfo != null)
{
MulticastDelegate multicastDelegate = field.GetValue(objectWithEvents) as MulticastDelegate;
if (multicastDelegate != null)
{
foreach (Delegate _delegate in multicastDelegate.GetInvocationList())
{
eventInfo.RemoveEventHandler(objectWithEvents, _delegate);
}
}
}
}
}
相关问题
- 1. 如何向Observable.FromEventPattern中使用的事件注册/取消注册处理程序?
- 2. 从空控件取消注册事件处理程序
- 3. 如何从事件中删除/取消注册事件处理程序?
- 4. 注册/取消注册事件处理程序的一般方法
- 5. 在MonoBehaviour中取消注册事件处理程序
- 6. 注册单个列表的事件处理程序
- 7. 注册事件处理程序在CQRS
- 8. C#如何取消订阅给定事件的所有事件处理程序?
- 9. 如何在YUI3的插件上注册事件处理程序
- 10. HTML DOM:如何获取注册事件处理程序的整个列表?
- 11. 我如何注册处理程序的Init()外的HttpApplication事件()
- 12. 如何在运行时取消注册委托处理程序
- 13. 如何取消注册TdxPNGImage作为属性处理程序?
- 14. 用事件处理程序动态加载用户控件 - 取消注册
- 15. 我必须取消订阅所有事件处理程序吗?
- 16. 如何在Javascript中注册window.external.notify事件处理程序
- 17. 如何在页面加载后注册事件处理程序?
- 18. 如何检查事件处理程序已注册
- 19. 我如何取消注册document.fire事件
- 20. 取消onbeforeunload事件处理程序?
- 21. Firefox没有注册事件处理程序?
- 22. CancellationToken - 取消请求后的注册处理程序
- 23. 如何从事件中删除所有事件处理程序?
- 24. 如何注册和取消注册中断事件
- 25. 在neo4j中注册事务事件处理程序
- 26. 单处理器,注册表或配置文件的数据库处理程序
- 27. 没有处理程序注册CQRS-ES
- 28. 以编程方式注册Sharepoint 2007事件处理程序
- 29. 取消注册所有自定义对象事件
- 30. Javascript:最好的地方注册事件处理程序
我,你就可以访问该变量,只需将其设置为空 - 没有必要去通过调用列表... – 2008-11-13 17:58:01