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

时间:2010-10-22 07:14:08

标签: c# event-handling

我希望创建一个自定义的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
                });
            }
        }

看起来可以接受吗?

3 个答案:

答案 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,或者从中派生的东西)。