为什么我不能使用反射获取LinkBut​​ton事件的事件处理程序?

时间:2016-07-23 11:16:50

标签: c# events reflection eventhandler

我想访问LinkButton的{​​{1}}事件的事件处理程序,但在下面的代码段Command中为空。

fieldInfo

代码段的灵感来自this

为什么LinkButton button = new LinkButton(); button.Command += (s, e) => { }; Type type = button.GetType(); EventInfo[] eventInfos = type.GetEvents(BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); foreach (EventInfo eventInfo in eventInfos) if (eventInfo.Name == "Command") { // fieldInfo is null FieldInfo fieldInfo = eventInfo.DeclaringType.GetField(eventInfo.Name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); Delegate delegates = (Delegate)fieldInfo.GetValue(button); foreach (Delegate handler in delegates.GetInvocationList()) { eventInfo.RemoveEventHandler(button, handler); // or eventInfo.AddEventHandler(button, handler); // or do whatever with handler } } 为空?

是否有其他方法可以获取fieldInfo LinkButton事件的事件处理程序?

使用Command作为字段名称,LinkButton sollution也无效{/ 1}}。

1 个答案:

答案 0 :(得分:3)

查看LinkCommand reference source

public event CommandEventHandler Command是"魔法"。

LinkCommand使用基类UI.Control,事件存储在protected EventHandlerList Events中。

LinkCommand还有一个名为EventCommand的私有属性,它似乎用作Events列表的索引器。

如果我正确阅读了来源,您需要提取Events[EventCommand]并将其CommandEventHandler转换为LinkButton OnCommand UI.Control

对于使用ideaTextField.frame = CGRectMake(0, 0, screenSize.width * (0.72), screenSize.height * (120/568)) //limit on characters ideaTextField.text = "Give us an idea" ideaTextField.center = CGPointMake(screenSize.width * 0.5, screenSize.height * 1.1) ideaTextField.font = UIFont(name: "Roboto", size: screenSize.height * (16/568)) ideaTextField.textAlignment = .Center ideaTextField.textColor = colorWithHexString(chosenColor) ideaTextField.delegate = self ideaTextField.addTarget(self, action: "startedEntering2:", forControlEvents: UIControlEvents.TouchDown) view.addSubview(ideaTextField) 作为基类的类,这似乎也是一种常见做法。