我有一个函数可以添加事件处理程序来控制事件。现在我有几个重载将事件添加到不同类型的控件:
Public Sub AddEventHandler(Button, ButtonEvent) 'adds event handling for Button.Click
public Sub AddEventHandler(LinkButton, ButtonEvent)'adds event handling for LinkButton.Click
问题是我想编写一个更健壮的函数,如:
Public sub AddEventHandler(Control, EventToHandle, ControlEvent)
,其中
EventToHandle是表示Button.Click或Button与之关联的任何事件的参数。
有什么建议吗?谢谢!
答案 0 :(得分:1)
你仍然可以这样做:
private void Subscribe<TControl>(TControl control, Action<TControl, EventHandler> subscriber, EventHandler handler)
{
subscriber.Invoke(control, handler);
}
使用:
Subscribe(this, (control, handler) => control.Load += handler, LoadHandler);
但我不认为实际订阅该活动会更好。
答案 1 :(得分:-1)
正确的方法可能是使用反射完成的。然而,更简单的方法是做这样的事情。
(代码在C#中,但转换非常简单。)
private void AddEventHandler(Control c, Event e){
if(c is LinkButton){
((LinkButton)c).Click += e;
}
else if(c is Button){
((Button)c).Click += e;
}
/* etc */
}
如果您有时想要做一个不是“Click”的事件,您可以将表示事件名称的字符串作为第三个参数传递并如此包装:
if(what_event == "Click"){
if(c is LinkButton){
((LinkButton)c).Click += e;
}
/* etc */
}
else if(what_event == "SelectedIndexChanged"){
if(c is DropDownList){
((DropDownList)c).SelectedIndexChanged += e;
}
/* etc */
}
很糟糕,但它可以工作,可能比你现在的更紧凑。