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

C# 透過反射取得事件註冊的委派清單:利用 EventHandlerList 與 GetInvocationList 列出所有訂閱方法

     編輯:關於C語言

反射取得事件處理方法


using System.Reflection;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Load += Form1_Load1;
        this.Load += Form1_Load2;

        // 1. 取得 Form 的非公開 Events 屬性 (EventHandlerList)
        PropertyInfo pi = typeof(Form).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
        EventHandlerList ehl = (EventHandlerList)pi.GetValue(this, null);

        // 2. 取得 Load 事件的 Key (EVENT_LOAD)
        FieldInfo fi = typeof(Form).GetField("EVENT_LOAD", BindingFlags.Static | BindingFlags.NonPublic);

        // 3. 從 EventHandlerList 取得委派
        Delegate d = ehl[fi.GetValue(null)];

        // 4. 列出所有訂閱方法
        if (d != null)
            foreach (Delegate del in d.GetInvocationList())
                Console.WriteLine(del.Method.Name); // 輸出: Form1_Load1, Form1_Load2
    }
    private void Form1_Load1(object sender, EventArgs e) { }
    private void Form1_Load2(object sender, EventArgs e) { }
}

關鍵步驟

  1. Events 屬性儲存所有事件的委派鏈結(EventHandlerList)。
  2. 每個事件對應一個靜態 Key(如 EVENT_LOAD)。
  3. GetInvocationList() 回傳鏈結中的每個委派,Method.Name 即為方法名稱。

此技巧可用於執行期診斷事件訂閱狀況、防止重複訂閱等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved