2010-10-22 84 views
9

我希望创建一个自定义的EventHandler,它可以有任意数量的对象作为其参数,并且它所获得的对象事先是未知的。C# - 创建一个可以接受任意数量参数的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

如何使用'params对象[] args'? – shahkalpesh 2010-10-22 07:22:10

+0

感谢您指出params,几乎我正在寻找的东西。现在,我将如何使用Kent在他的答案中写下的最佳做法来使用参数? – 2010-10-22 07:25:34

+1

我们可能会更好地解决导致您使用此当前解决方案的问题,而不是尝试修复此解决方案。即这个事件处理程序的定义看起来很可疑,那么它实际上解决了什么问题?你为什么不知道你将传递给事件处理程序的对象?为什么他们没有比对象更好的父类?等等。 – 2010-10-22 07:29:50

回答

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, "")); 
+0

谢谢你的回答,它总结了我一直在寻找的一切。 – 2010-10-22 07:34:17

4

可以定义一个委托作为这样的:

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; 
+0

谢谢Kent。也许我有点不清楚我真正想要的东西。我希望能够单独传递一个对象数组或多个对象,并且我不知道有多少个对象。 – 2010-10-22 07:18:29

1

没有什么能阻止你声明接受一个参数数组的委托,和你一样会定义任何其他方法需要多个参数:

delegate void someCustomEvent(params object[] args); 

event someCustomEvent sce; 

但是,这将是不寻常的。正如肯特所说,按照.NET平台上的惯例,事件处理程序接受两个参数(发送者(对象)和事件参数(EventArgs或从中派生的东西))会更加正常。

相关问题