我想访问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}}。
答案 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)
作为基类的类,这似乎也是一种常见做法。