Joh*_*tål 11 c# event-handling
我希望创建一个自定义的EventHandler,它可以包含任意数量的对象作为参数,并且事先不知道它获取的对象.
我知道我可以传递一个Object [],但我想要的是类似的东西
MyEventHandler someCustomEvent(Object obj1, Object obj2, Object obj3)
Run Code Online (Sandbox Code Playgroud)
如果需要,对象的数量可以是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
});
}
}
Run Code Online (Sandbox Code Playgroud)
它看起来可以接受吗?
pro*_*ick 13
EventHandler 只是一个代表.
您可以像这样创建委托:
public delegate void Foo(params object[] args);
Run Code Online (Sandbox Code Playgroud)
事件:
public event Foo Bar;
Run Code Online (Sandbox Code Playgroud)
你将最终得到像这样的射击事件:
Bar(1, "");
Run Code Online (Sandbox Code Playgroud)
但是,正如@Kent Boogaart所说,你应该使用创建事件EventHandler<TEventArgs>,所以更好的方法是创建类:
public class MyEventArgs : EventArgs
{
public MyEventArgs(params object[] args)
{
Args = args;
}
public object[] Args { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
事件:
public event EventHandler<MyEventArgs> Bar2;
Run Code Online (Sandbox Code Playgroud)
所以你会像这样触发事件:
Bar2(this, new MyEventArgs(1, ""));
Run Code Online (Sandbox Code Playgroud)
您可以这样定义委托:
public delegate void MyHandler(object p1, object p2, object p3);
Run Code Online (Sandbox Code Playgroud)
然后在事件定义中使用它:
public event MyHandler MyEvent;
Run Code Online (Sandbox Code Playgroud)
但是,这与最佳做法相反,不建议使用.相反,您应该将所需的所有额外信息封装到您自己的EventArgs子类中,并使用您的委托中的信息:
public class MyEventArgs : EventArgs
{
// any extra info you need can be defined as properties in this class
}
public event EventHandler<MyEventArgs> MyEvent;
Run Code Online (Sandbox Code Playgroud)