Heim > Backend-Entwicklung > C++ > Können Ereignishandler zur Laufzeit in C# gestohlen und neu zugewiesen werden?

Können Ereignishandler zur Laufzeit in C# gestohlen und neu zugewiesen werden?

Barbara Streisand
Freigeben: 2024-12-30 21:06:09
Original
324 Leute haben es durchsucht

Can Event Handlers Be Stolen and Reassigned at Runtime in C#?

Ereignishandler stehlen: Eine Laufzeit-Odyssee

Einführung:

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.

Ursprüngliche Frage:

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.

Lösung:

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.

Implementierungsdetails:

Die Lösung umfasst mehrere Schritte:

  1. Abrufen der geheime Ereignisschlüssel: Ereignishandler werden intern unter Verwendung eines privaten Felds namens „EventClick“ gespeichert. Reflection wird verwendet, um statisch auf dieses Feld zuzugreifen.
  2. Abrufen der EventHandlerList: Die Eigenschaft „Events“ der Component-Klasse speichert eine EventHandlerList, die alle registrierten Event-Handler enthält. Der Zugriff auf diese Eigenschaft erfolgt über Reflektion.
  3. Entfernen des Handlers aus der Quelle:Mithilfe der EventHandlerList kann der Event-Handler aus der Quellcodeverwaltung (btn1) entfernt werden.
  4. Hinzufügen des Handlers zum Ziel: Dieselbe EventHandlerList wird dann verwendet, um den Ereignishandler zum Zielsteuerelement hinzuzufügen (btn2).

Beispielcode:

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");
    }
  }
}
Nach dem Login kopieren

Vorbehalt:

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage