我希望创建一个自定义的EventHandler,它可以包含任意数量的对象作为参数,并且事先不知道它所获得的对象。
我知道我可以传递一个Object [],但我想要的是类似于
的东西MyEventHandler someCustomEvent(Object obj1, Object obj2, Object obj3)
如果需要,对象的数量可以是0或10。
修改
感谢我的评论和答案,我已经到了这里,
public class FinishedEventArgs : EventArgs {
public Object[] Args{ get; set; }
}
protected void OnFinished(params Object[] args) {
if(this.Finished != null) {
this.Finished(this, new FinishedEventArgs() {
Args = args
});
}
}
看起来可以接受吗?
答案 0 :(得分:12)
EventHandler
只是一名代表。
您可以像这样创建委托:
public delegate void Foo(params object[] args);
事件:
public event Foo Bar;
你最终会得到这样的射击事件:
Bar(1, "");
但是,正如@Kent Boogaart所说,您应该使用EventHandler<TEventArgs>
创建事件,因此更好的方法是创建类:
public class MyEventArgs : EventArgs
{
public MyEventArgs(params object[] args)
{
Args = args;
}
public object[] Args { get; set; }
}
事件:
public event EventHandler<MyEventArgs> Bar2;
所以你会发射这样的事件:
Bar2(this, new MyEventArgs(1, ""));
答案 1 :(得分:6)
您可以这样定义委托:
public delegate void MyHandler(object p1, object p2, object p3);
然后在事件定义中使用它:
public event MyHandler MyEvent;
但是,这与最佳做法相反,不建议使用。相反,您应该将所需的所有额外信息封装到您自己的EventArgs
子类中,并使用您的代理中的那些:
public class MyEventArgs : EventArgs
{
// any extra info you need can be defined as properties in this class
}
public event EventHandler<MyEventArgs> MyEvent;
答案 2 :(得分:1)
没有什么可以阻止你声明一个接受params数组的委托,就像你定义任何其他带有多个参数的方法一样:
delegate void someCustomEvent(params object[] args);
event someCustomEvent sce;
然而,这将是不寻常的。正如Kent所说,遵循.Net平台上的约定更常见的是让事件处理程序接受两个参数,发送者(对象)和事件参数(EventArgs,或者从中派生的东西)。