2010-10-22 37 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或從中派生的東西))會更加正常。

相關問題