首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

C# 反射取得 ToolStripItem 所有 Click 事件處理器並批次移除

     編輯:關於ASP.NET

Windows Forms 中 ToolStripItem 的事件處理器存儲在非公開 EventHandlerList 中。本文示範使用反射取得 Click 事件所有委派並批次移除的技巧。

核心代碼

ToolStripItem item = sender as ToolStripItem;

// 1. 取得非公開 Events 屬性 (EventHandlerList)
PropertyInfo eventsProp = typeof(ToolStripItem).GetProperty("Events",
    BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList eventList = (EventHandlerList)eventsProp.GetValue(item, null);

// 2. 取得非公開 EventClick 欄位 (事件鍵)
FieldInfo eventClickField = typeof(ToolStripItem).GetField("EventClick",
    BindingFlags.Static | BindingFlags.NonPublic);
object eventKey = eventClickField.GetValue(null);

// 3. 取得委派鏈
Delegate clickDelegate = eventList[eventKey];

// 4. 遍歷並移除每個處理器
if (clickDelegate != null)
{
    foreach (Delegate handler in clickDelegate.GetInvocationList())
    {
        item.Click -= (EventHandler)handler;
        // 可在此處記錄、檢查、替換處理器
    }
}

關鍵點解析

步驟BindingFlags說明
取得 Events 屬性Instance | NonPublic每個實例獨立的事件列表
取得 EventClick 欄位Static | NonPublic靜態唯讀鍵值,所有實例共用
GetInvocationList()-取得多播委派的單個處理器陣列

應用場景

  • 動態切換行為模式 (編輯/檢視/唯讀) 需清空舊事件。
  • 外掛系統卸載時清理事件訂閱,防記憶體洩漏。
  • 測試代碼中模擬/驗證事件綁定狀態。

注意事項

  • 反射非公開成員屬於實作細節,Framework 升級可能變動,生產代碼謹慎使用。
  • .NET Core / .NET 5+ Windows Forms 實作可能不同,需實測驗證。
  • 優先考慮設計模式 (命令模式、觀察者模式) 替代直接操作事件列表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved