Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memindahkan Pengendali Acara Antara Kawalan dalam C#?
Bolehkah Anda Diam-diam "Mencuri" Pengendali Acara?
Dalam kebingungan pengekodan, anda berusaha untuk memindahkan pengendali acara dari satu kawalan ke kawalan yang lain . Namun, pengkompil berdiri sebagai penghalang yang tidak mudah menyerah.
Teka-teki Kod:
Button btn1 = new Button(); btn1.Click += new EventHandler(btn1_Click); Button btn2 = new Button(); // Assign btn1's event to btn2 (but met with rejection from compiler) btn2.Click += btn1.Click; // Compiler denies
Kemungkinan Teknik Kecurian:
Helah Berasaskan Refleksi:
Jika kekerasan bukan gaya anda, maka memakai jubah renungan mungkin mendedahkan laluan terselindung.
using System.Reflection; // Declare event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); // Retrieve click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events1 = (EventHandlerList)eventsProp.GetValue(btn1, null); Delegate click = events1[eventClick.GetValue(null)]; // Remove from btn1, assign to btn2 events1.RemoveHandler(eventClick.GetValue(null), click); EventHandlerList events2 = (EventHandlerList)eventsProp.GetValue(btn2, null); events2.AddHandler(eventClick.GetValue(null), click);
Berhati-hati, Microsoft telah membina yang menggerunkan halangan untuk menghalang gerakan tersebut. Tetapi bagi mereka yang berani, teknik menggunakan refleksi ini memberikan akses kepada alam tersembunyi pengendalian acara!
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memindahkan Pengendali Acara Antara Kawalan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!