Rumah >pembangunan bahagian belakang >C++ >Bolehkah Pengendali Acara Dipindahkan Antara Kawalan Menggunakan Refleksi?

Bolehkah Pengendali Acara Dipindahkan Antara Kawalan Menggunakan Refleksi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-31 11:18:15174semak imbas

Can Event Handlers Be Transferred Between Controls Using Reflection?

Bolehkah Pengendali Acara Dipindahkan Antara Kawalan?

Soalan:

Adakah boleh dibayangkan untuk "mencuri" pengendali acara dikaitkan dengan satu kawalan dan berikannya kepada lain?

Jawapan:

Ya, ada kemungkinan dengan kaveat: refleksi diperlukan. Ramai ahli yang berkaitan disembunyikan sebagai peribadi atau dalaman.

Pelaksanaan:

Buat projek Windows Forms baharu dan letakkan dua butang pada borangnya. Kemudian, gunakan kod berikut:

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");
    }
  }
}

Nota: Ini menunjukkan cara Microsoft menyekat akses kepada kaedah kritikal atas sebab keselamatan.

Atas ialah kandungan terperinci Bolehkah Pengendali Acara Dipindahkan Antara Kawalan Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn