C# - 创建一个可以接受任意数量参数的EventHandler

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)


Ken*_*art 6

您可以这样定义委托:

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)