Frage:
Ist es denkbar, einen Event-Handler zu „stehlen“. Sie können es mit einem Steuerelement verknüpfen und ihm zuweisen ein anderer?
Antwort:
Ja, es ist möglich mit einer Einschränkung: Reflexion ist notwendig. Viele relevante Mitglieder werden als privat oder intern verborgen.
Implementierung:
Erstellen Sie ein neues Windows Forms-Projekt und platzieren Sie zwei Schaltflächen in seinem Formular. Verwenden Sie dann den folgenden Code:
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"); } } }
Hinweis: Dies zeigt, wie Microsoft aus Sicherheitsgründen den Zugriff auf kritische Methoden einschränkt.
Das obige ist der detaillierte Inhalt vonKönnen Ereignishandler mithilfe von Reflection zwischen Steuerelementen übertragen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!