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 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.
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.
Penyelesaian melibatkan beberapa langkah:
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"); } } }
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!