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

C#-创建可以接受任意数量参数的EventHandler,c#,event-handling,C#,Event Handling,我希望创建一个自定义EventHandler,它可以有任意数量的对象作为其参数,并且它得到的对象事先不知道 我知道我可以传递给它一个对象[],但我想要的是类似于 MyEventHandler someCustomEvent(Object obj1, Object obj2, Object obj3) 其中,如果需要,对象的数量可以是0或10 编辑: 多亏了我的评论和回答,我才得出了这个结论 public class FinishedEventArgs : EventArgs {

我希望创建一个自定义EventHandler,它可以有任意数量的对象作为其参数,并且它得到的对象事先不知道

我知道我可以传递给它一个对象[],但我想要的是类似于

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
                });
            }
        }

它看起来可以接受吗?

您可以这样定义一个委托:

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;
公共类MyEventArgs:EventArgs
{
//您需要的任何额外信息都可以在此类中定义为属性
}
公共事件事件处理程序;

没有什么可以阻止您声明一个接受params数组的委托,就像您定义任何其他接受多个参数的方法一样:

delegate void someCustomEvent(params object[] args);

event someCustomEvent sce;

然而,这将是不寻常的。正如Kent所说,在.Net平台上遵循事件处理程序接受两个参数的约定更为正常,发送方(对象)和事件参数(EventArgs,或从中派生的其他参数)。

EventHandler
只是一个委托

您可以这样创建委托:

public delegate void Foo(params object[] args);
Bar(1, "");
Bar2(this, new MyEventArgs(1, ""));
及活动:

public event Foo Bar;
public event EventHandler<MyEventArgs> Bar2;
您将以这样的触发事件结束:

public delegate void Foo(params object[] args);
Bar(1, "");
Bar2(this, new MyEventArgs(1, ""));
但是,正如@Kent Boogaart所说,您应该使用
EventHandler
创建事件,所以更好的方法是创建类:

public class MyEventArgs : EventArgs
{
    public MyEventArgs(params object[] args)
    {
        Args = args;
    }

    public object[] Args { get; set; }
}
及活动:

public event Foo Bar;
public event EventHandler<MyEventArgs> Bar2;

谢谢你,肯特。也许我不太清楚我到底想要什么。我希望能够单独传递一个对象数组或多个对象,但我不知道预先有多少个对象。使用
params object[]args
?感谢您指出params,这正是我想要的。现在,我该如何按照Kent在回答中所写的最佳实践使用params?我们可能会更好地解决导致您使用此当前解决方案的问题,而不是尝试修复此解决方案。也就是说,这个事件处理程序定义看起来可疑,那么它实际上为您解决了什么问题呢?为什么不知道要传递给事件处理程序的对象?为什么它们没有比object更好的父类?等等。谢谢你的回答,它很好地总结了我所寻找的一切。