问题:
是否可以“窃取”事件处理程序与一个控件关联并将其分配给另一个?
答案:
是的,有可能,但需要注意:反思是必要的。许多相关成员被隐藏为私有或内部。
实现:
创建一个新的 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中文网其他相关文章!