Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memindahkan Pengendali Acara Antara Kawalan dalam C#?

Bagaimanakah Saya Boleh Memindahkan Pengendali Acara Antara Kawalan dalam C#?

Linda Hamilton
Linda Hamiltonasal
2025-01-02 14:51:38680semak imbas

How Can I Transfer an Event Handler Between Controls in 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:

  • Pemindahan Terus: Malangnya, ini pendekatan yang kelihatan mudah mencetuskan balas pengkompil yang tegas.
  • Replikasi Pengendali: Menyalin pengendali acara dan memberikannya kepada berbilang kawalan boleh dilakukan. Walau bagaimanapun, ia bukanlah penyelesaian yang dicari dalam kes ini.

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!

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