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

C# 反射綁定事件處理器:EventInfo.AddEventHandler 動態訂閱實作

     編輯:關於C#

傳統強型別訂閱


Customer c = new Customer();
c.OnChange += new EventHandler(c_OnChange); // 編譯期綁定
c.Change();

static void c_OnChange(object sender, EventArgs e) {
    Console.WriteLine("事件被觸發了");
}

class Customer {
    public event EventHandler OnChange;
    public void Change() { if (OnChange != null) OnChange(this, null); }
}

反射動態訂閱


Customer c = new Customer();

// 取得事件資訊(包含非公開、實例、公開)
EventInfo evt = c.GetType().GetEvent("OnChange",
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

// 動態加入處理器
evt.AddEventHandler(c, new EventHandler(c_OnChange));

c.Change(); // 正常觸發

關鍵差異與應用場景

注意事項

  • BindingFlags 必須正確組合,否則找不到事件
  • 處理器委派型別必須與事件聲明完全一致
  • 反射效能較低,高頻呼叫建議快取 EventInfo 與委派
  • 同樣適用於移除處理器:evt.RemoveEventHandler(c, handler)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性傳統訂閱反射訂閱
型別安全編譯期檢查執行期解析
事件名稱硬編碼字串指定
適用場景一般開發插件架構、動態載入組件、事件名稱由配置決定