我有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