首页 > 后端开发 > C++ > 事件处理程序可以使用反射在控件之间传输吗?

事件处理程序可以使用反射在控件之间传输吗?

Mary-Kate Olsen
发布: 2024-12-31 11:18:15
原创
152 人浏览过

Can Event Handlers Be Transferred Between Controls Using Reflection?

事件处理程序可以在控件之间转移吗?

问题:

是否可以“窃取”事件处理程序与一个控件关联并将其分配给另一个?

答案:

是的,有可能,但需要注意:反思是必要的。许多相关成员被隐藏为私有或内部。

实现:

创建一个新的 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板