你能偷偷地「竊取」事件處理程序嗎?
在編碼困境中,你試圖將事件處理程序從一個控制項傳送到另一個控制項。然而,編譯器卻是一道難以跨越的障礙。
代碼難題:
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中文網其他相關文章!