Rumah > pembangunan bahagian belakang > C++ > Bolehkah Pengendali Acara Dicuri dan Ditugaskan Semula pada Runtime dalam C#?

Bolehkah Pengendali Acara Dicuri dan Ditugaskan Semula pada Runtime dalam C#?

Barbara Streisand
Lepaskan: 2024-12-30 21:06:09
asal
324 orang telah melayarinya

Can Event Handlers Be Stolen and Reassigned at Runtime in C#?

Pengendali Acara Mencuri: Pengembaraan Masa Jalan

Pengenalan:

Dalam pembangunan perisian, kadangkala mungkin perlu untuk menetapkan pengendali acara daripada satu kawalan kepada yang lain pada masa larian. Artikel ini menyelidiki kemungkinan operasi sedemikian, meneroka kedua-dua kaveat yang berpotensi dan penyelesaian yang tersedia.

Soalan Asal:

Soalan asal cuba mencari jalan untuk memindahkan pengendali acara yang diberikan ke butang (btn1) ke butang lain (btn2) pada masa jalan. Walau bagaimanapun, pengkompil menganggap tugasan ini tidak sah, dengan menyatakan bahawa pengendali acara hanya boleh ditugaskan di sebelah kiri tugasan.

Penyelesaian:

Sementara pendekatan mudah dipenuhi dengan ralat pengkompil , ternyata mencuri pengendali acara semasa runtime memang boleh dilakukan, walaupun dengan kaveat: refleksi diperlukan. Reflection memberikan akses kepada ahli peribadi dan dalaman objek, yang biasanya tidak boleh diakses.

Butiran Pelaksanaan:

Penyelesaian melibatkan beberapa langkah:

  1. Mendapatkan semula Kunci Peristiwa Rahsia: Pengendali acara disimpan secara dalaman menggunakan medan peribadi bernama "EventClick." Refleksi digunakan untuk mengakses medan ini secara statik.
  2. Mendapatkan EventHandlerList: Sifat "Events" kelas Komponen menyimpan EventHandlerList yang mengandungi semua pengendali acara berdaftar. Sifat ini diakses melalui refleksi.
  3. Mengalih keluar Pengendali daripada Sumber: Menggunakan EventHandlerList, pengendali acara boleh dialih keluar daripada kawalan sumber (btn1).
  4. Menambah Pengendali ke Destinasi: EventHandlerList yang sama kemudiannya digunakan untuk menambah pengendali acara ke kawalan destinasi (btn2).

Kod Contoh:

Kod berikut menunjukkan teknik mencuri acara:

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");
    }
  }
}
Salin selepas log masuk

Kaveat:

Seperti yang ditunjukkan oleh kod, proses mencuri pengendali acara agak berbelit-belit dan memerlukan pengetahuan yang rumit tentang objek dalaman struktur. Jelas sekali bahawa Microsoft telah melakukan usaha yang besar untuk menghalang akses terus kepada struktur ini, mencadangkan bahawa teknik ini harus digunakan dengan bijak.

Atas ialah kandungan terperinci Bolehkah Pengendali Acara Dicuri dan Ditugaskan Semula pada Runtime dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan