Pouvez-vous sournoisement « voler » les gestionnaires d'événements ?
Dans un dilemme de codage, vous cherchez à transférer un gestionnaire d'événements d'un contrôle à un autre . Pourtant, le compilateur constitue une barrière inflexible.
L'énigme du code :
Button btn1 = new Button(); btn1.Click += new EventHandler(btn1_Click); Button btn2 = new Button(); // Assign btn1's event to btn2 (but met with rejection from compiler) btn2.Click += btn1.Click; // Compiler denies
Techniques de vol possibles :
L'astuce basée sur la réflexion :
Si la force brute n'est pas votre style, alors revêtir le manteau de la réflexion peut dévoiler un chemin secret.
using System.Reflection; // Declare event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); // Retrieve click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events1 = (EventHandlerList)eventsProp.GetValue(btn1, null); Delegate click = events1[eventClick.GetValue(null)]; // Remove from btn1, assign to btn2 events1.RemoveHandler(eventClick.GetValue(null), click); EventHandlerList events2 = (EventHandlerList)eventsProp.GetValue(btn2, null); events2.AddHandler(eventClick.GetValue(null), click);
Attention, Microsoft a érigé de formidables barrières pour empêcher de tels manœuvres. Mais pour ceux qui osent, cette technique de réflexion donne accès aux royaumes cachés de la gestion des événements !
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!