你能偷偷地“窃取”事件处理程序吗?
在编码困境中,你试图将事件处理程序从一个控件传输到另一个控件。然而,编译器却是一道难以逾越的障碍。
代码难题:
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
可能的盗窃技术:
基于反射的技巧:
如果暴力不是你的风格,那么披上反射的外衣可能会揭开一条隐秘的道路。
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);
请注意,微软已经建立了强大的障碍来防止这种行为。但对于那些敢于尝试的人来说,这种运用反射的技术可以让他们进入事件处理的隐藏领域!
以上是如何在 C# 中的控件之间传输事件处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!