Heim >Backend-Entwicklung >C++ >Können Ereignishandler in C# dynamisch neu zugewiesen werden?
Event-Handler dynamisch zuweisen: Ist das möglich?
In der Softwareentwicklung sind Event-Handler entscheidend für die Etablierung ereignisgesteuerter Interaktionen zwischen UI-Elementen und der zugrunde liegende Code. Es stellt sich jedoch häufig die Frage: Ist es möglich, einen einem Steuerelement zugewiesenen Ereignishandler zu „stehlen“ und ihn einem anderen zuzuweisen?
Die Einschränkung des Compilers
Bei der Zuweisung Wenn Sie Event-Handler mit dem =-Operator verwenden, schränkt der Compiler die Zuweisung eines bereits zugewiesenen Event-Handlers ein. Der Versuch, den btn1 zugewiesenen Ereignishandler für btn2 wiederzuverwenden, führt zu einem Compilerfehler.
Reflection: A Solution Pathway
Trotz der Einschränkung des Compilers ist dies tatsächlich möglich Event-Handler zur Laufzeit mittels Reflektion zu übertragen. Dieser Ansatz erfordert direkten Zugriff auf private und interne Mitglieder der Kontrollklasse.
Codebeispiel
Beachten Sie den folgenden Codeausschnitt:
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"); } } }
In diesem Code wird der geheime interne Ereignisschlüssel abgerufen und für den Zugriff auf die Ereignishandlerliste von btn1 verwendet. Der Event-Handler wird dann aus btn1 entfernt und zu btn2 hinzugefügt.
Komplexität und Einschränkungen
Obwohl Reflektion eine Möglichkeit bietet, Event-Handler zu übertragen, ist es wichtig, dies zu beachten Dieser Ansatz ist komplex und sollte mit Vorsicht angewendet werden. Dabei geht es um den Zugriff auf interne Implementierungsdetails der Kontrollklasse, die sich in verschiedenen Versionen des Frameworks ändern können.
Das obige ist der detaillierte Inhalt vonKönnen Ereignishandler in C# dynamisch neu zugewiesen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!