Können Sie Event-Handler schlau „stehlen“?
In einem Codierungsproblem versuchen Sie, einen Event-Handler von einem Steuerelement auf ein anderes zu übertragen . Dennoch stellt der Compiler eine unnachgiebige Barriere dar.
Das Code-Rätsel:
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
Mögliche Diebstahltechniken:
Der reflexionsbasierte Trick:
Wenn rohe Gewalt nicht Ihr Stil ist, dann Das Anziehen des Mantels der Reflexion kann einen verborgenen Weg offenbaren.
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);
Vorsicht, Microsoft hat gewaltige Hindernisse errichtet solche Manöver verhindern. Aber für diejenigen, die es wagen, gewährt diese Reflexionstechnik Zugang zu verborgenen Bereichen der Ereignisverarbeitung!
Das obige ist der detaillierte Inhalt vonWie kann ich einen Event-Handler zwischen Steuerelementen in C# übertragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!