使用反射令2个事件在不知道方法名的情况下使用同一个处理方法

来源:互联网 发布:中国自然资源数据库 编辑:程序博客网 时间:2024/05/01 01:42
今天在社区碰到了一个比较有意思的问题,将button1的Click事件与button2的Click事件在不知道方法名的情况下如何使用同一个处理方法,我之前已经解答了一个类似的问题,是要用到委托列表类实现的,上代码:
  1.   private void Form1_Load(object sender, EventArgs e)
  2.          {
  3.              Button btn1 = new Button();
  4.              btn1.Text = "button1";
  5.              btn1.Click += new EventHandler(delegate(object s, EventArgs e2) { MessageBox.Show(s.ToString()); });
  6.              btn1.Name = "btn1";
  7.              btn1.Location = new Point(10, 10);
  8.              this.Controls.Add(btn1);
  9.              Button btn2 = new Button();
  10.              btn2.Text = "button2";
  11.              btn2.Name = "btn2";
  12.              btn2.Location = new Point(10, 30);
  13.              Type t = btn1.GetType();
  14.              PropertyInfo pi = t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);//获取button1的事件属性
  15.              EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn1, null);//获取button1的委托列表
  16.              FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
  17.              Delegate d = ehl[fieldInfo.GetValue(null)];
  18.              btn2.Click += (EventHandler)d;
  19.              this.Controls.Add(btn2);
  20.          }