Rumah >pembangunan bahagian belakang >C++ >Bolehkah Pengendali Acara Ditugaskan Semula Secara Dinamik dalam 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!