Rumah >pembangunan bahagian belakang >C++ >Bolehkah Pengendali Acara Ditugaskan Semula Secara Dinamik dalam C#?

Bolehkah Pengendali Acara Ditugaskan Semula Secara Dinamik dalam C#?

Susan Sarandon
Susan Sarandonasal
2024-12-31 02:46:09764semak imbas

Can Event Handlers Be Dynamically Reassigned in C#?

Menetapkan Pengendali Acara Secara Dinamik: Adakah Mungkin?

Dalam pembangunan perisian, pengendali acara adalah penting untuk mewujudkan interaksi dipacu peristiwa antara elemen UI dan kod asas. Walau bagaimanapun, persoalan biasa timbul: Adakah mungkin untuk "mencuri" pengendali acara yang diberikan kepada satu kawalan dan menyerahkannya kepada kawalan yang lain?

Sekatan Pengkompil

Apabila menetapkan pengendali acara menggunakan operator =, pengkompil mengehadkan tugasan pengendali acara yang telah ditetapkan. Percubaan untuk menggunakan semula pengendali acara yang diberikan kepada btn1 untuk btn2 akan mengakibatkan ralat pengkompil.

Refleksi: Laluan Penyelesaian

Walaupun terdapat sekatan pengkompil, ia sememangnya mungkin untuk memindahkan pengendali acara pada masa jalan menggunakan refleksi. Pendekatan ini memerlukan akses terus kepada ahli peribadi dan dalaman kelas kawalan.

Sampel Kod

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

Dalam kod ini, kunci acara dalaman rahsia diambil dan digunakan untuk mengakses senarai pengendali acara btn1. Pengendali acara kemudian dialih keluar daripada btn1 dan ditambahkan pada btn2.

Kerumitan dan Had

Walaupun refleksi menyediakan cara untuk memindahkan pengendali acara, adalah penting untuk ambil perhatian bahawa pendekatan ini adalah kompleks dan harus digunakan dengan berhati-hati. Ia melibatkan mengakses butiran pelaksanaan dalaman bagi kelas kawalan, yang mungkin berubah merentas versi rangka kerja yang berbeza.

Atas ialah kandungan terperinci Bolehkah Pengendali Acara Ditugaskan Semula Secara Dinamik dalam C#?. 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