首頁 > 後端開發 > C++ > 如何在 C# 中的控制項之間傳輸事件處理程序?

如何在 C# 中的控制項之間傳輸事件處理程序?

Linda Hamilton
發布: 2025-01-02 14:51:38
原創
688 人瀏覽過

How Can I Transfer an Event Handler Between Controls in C#?

你能偷偷地「竊取」事件處理程序嗎?

在編碼困境中,你試圖將事件處理程序從一個控制項傳送到另一個控制項。然而,編譯器卻是一道難以跨越的障礙。

代碼難題:

Button btn1 = new Button();
btn1.Click += new EventHandler(btn1_Click);
Button btn2 = new Button();
// Assign btn1's event to btn2 (but met with rejection from compiler)
btn2.Click += btn1.Click; // Compiler denies
登入後複製

可能的竊盜技術:

  • 直接接送
  • 唉,這種看似簡單的方法會引發嚴厲的編譯器反駁。
  • 處理程序複製:
  • 複製事件處理程序並將其指派給多個控制項是可行的。然而,在這種情況下,這並不是受歡迎的解決方案。

以反射為基礎的技巧:

如果暴力不是你的風格,那麼披上反射的外衣可能會揭開一條隱密的道路。
using System.Reflection;

// Declare event key
FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);

// Retrieve click event
PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);

EventHandlerList events1 = (EventHandlerList)eventsProp.GetValue(btn1, null);
Delegate click = events1[eventClick.GetValue(null)];

// Remove from btn1, assign to btn2
events1.RemoveHandler(eventClick.GetValue(null), click);
EventHandlerList events2 = (EventHandlerList)eventsProp.GetValue(btn2, null);
events2.AddHandler(eventClick.GetValue(null), click);
登入後複製

請注意,微軟已經建立了強大的障礙來防止這種行為。但對於那些敢於嘗試的人來說,這種運用反射的技術可以讓他們進入事件處理的隱藏領域!

以上是如何在 C# 中的控制項之間傳輸事件處理程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板