問題:
是否可以「竊取」事件處理程序與一個控制項關聯並將其指派給另一個控制項?
答案:
是的,有可能,但需要注意:反思是必要的。許多相關成員被隱藏為私有或內部。
實作:
建立一個新的 Windows 窗體項目並在其表單上放置兩個按鈕。然後,使用以下程式碼:
using System; using System.ComponentModel; using System.Windows.Forms; using System.Reflection; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += new EventHandler(button1_Click); // Get secret click event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); object secret = eventClick.GetValue(null); // Retrieve the click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events = (EventHandlerList)eventsProp.GetValue(button1, null); Delegate click = events[secret]; // Remove it from button1, add it to button2 events.RemoveHandler(secret, click); events = (EventHandlerList)eventsProp.GetValue(button2, null); events.AddHandler(secret, click); } void button1_Click(object sender, EventArgs e) { MessageBox.Show("Yada"); } } }
注意:這示範了 Microsoft 如何出於安全原因限制對關鍵方法的存取。
以上是事件處理程序可以使用反射在控制項之間傳輸嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!