Dans le développement de logiciels, il peut parfois être nécessaire d'attribuer un gestionnaire d'événements à partir d'un contrôle à un autre au moment de l'exécution. Cet article examine la faisabilité d'une telle opération, en explorant à la fois les mises en garde potentielles et les solutions de contournement disponibles.
La question initiale cherchait à trouver un moyen de transférer un gestionnaire d'événements affecté à un bouton (btn1) à un autre bouton (btn2) au moment de l'exécution. Cependant, le compilateur a jugé cette affectation invalide, déclarant que les gestionnaires d'événements ne peuvent être affectés qu'au côté gauche des affectations.
Alors que l'approche simple a rencontré une erreur du compilateur , il s'avère que voler des gestionnaires d'événements au moment de l'exécution est effectivement possible, mais avec une mise en garde : une réflexion est nécessaire. Reflection accorde l'accès aux membres privés et internes des objets, qui sont généralement inaccessibles.
La solution comporte plusieurs étapes :
Le code suivant démontre la technique de vol d'événements :
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"); } } }
Comme Comme l'illustre le code, le processus de vol des gestionnaires d'événements est plutôt compliqué et nécessite une connaissance complexe des structures d'objets internes. Force est de constater que Microsoft a déployé des efforts importants pour empêcher l’accès direct à ces structures, suggérant que cette technique devrait être utilisée judicieusement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!