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() | - | 取得多播委派的單個處理器陣列 |