In der Softwareentwicklung kann es manchmal erforderlich sein, einen Ereignishandler von einem Steuerelement aus zuzuweisen zu einem anderen zur Laufzeit. Dieser Artikel befasst sich eingehend mit der Machbarkeit eines solchen Vorgangs und untersucht sowohl die möglichen Einschränkungen als auch die verfügbaren Problemumgehungen.
Die ursprüngliche Frage zielte darauf ab, eine Möglichkeit zu finden, einen zugewiesenen Event-Handler zu übertragen zu einer Schaltfläche (btn1) zu einer anderen Schaltfläche (btn2) zur Laufzeit. Der Compiler hielt diese Zuweisung jedoch für ungültig und gab an, dass Event-Handler nur der linken Seite von Zuweisungen zugewiesen werden können.
Während der direkte Ansatz auf einen Compilerfehler stieß , stellt sich heraus, dass das Stehlen von Event-Handlern zur Laufzeit tatsächlich möglich ist, wenn auch mit einer Einschränkung: Überlegung ist erforderlich. Reflection gewährt Zugriff auf private und interne Mitglieder von Objekten, auf die normalerweise nicht zugegriffen werden kann.
Die Lösung umfasst mehrere Schritte:
Der folgende Code demonstriert die Event-Stealing-Technik:
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"); } } }
As Wie der Code zeigt, ist der Prozess des Diebstahls von Event-Handlern ziemlich kompliziert und erfordert umfassende Kenntnisse der internen Objektstrukturen. Es ist klar, dass Microsoft erhebliche Anstrengungen unternommen hat, um den direkten Zugriff auf diese Strukturen zu verhindern, was darauf hindeutet, dass diese Technik mit Bedacht eingesetzt werden sollte.
Das obige ist der detaillierte Inhalt vonKönnen Ereignishandler zur Laufzeit in C# gestohlen und neu zugewiesen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!