2010-07-08 46 views
0

我讀過MyEventHandler/MyEventArgs模型的一個好處,它允許標準事件處理程序處理各種事件。這聽起來不錯,但也許我正在理解這應該如何工作。我有以下代碼:EventHandler設計實踐

public delegate void DataArrivalEventHandler 
    (object sender, DataArrivalEventArgs e); 

public class DataArrivalEventArgs : EventArgs 
{ 
    public DateTime Arrival { get; protected set; } 

    public DataArrivalEventArgs() 
    { 
     Arrival = DateTime.Now; 
    } 

    public DataArrivalEventArgs(DateTime arrival) 
    { 
     Arrival = arrival; 
    } 
} 

...

_pipeReader.DataArrival += new EventHandler(Pipe_DataArrival); 

...

private void Pipe_DataArrival(object sender, EventArgs e) 
{ 
    ... 
} 

的代碼拋出當我嘗試添加的事件處理程序的錯誤,但是,說它不能暗示將DataArrivalEventHandler轉換爲EventHandler。改變DataArrivalEventHandler(Pipe_DataArrival)EventHandler(Pipe_DataArrival)修復了這個問題,所以我覺得你應該能夠爲更具體的事件添加通用的事件處理程序(我明白你爲什麼不能這樣做)

是我該怎麼做做到這一點的最佳方式,還是有更好的習慣?

回答

0

你得到它的方式是正確的。

有沒有轉換從一個更具體的委託類型,以更一般的一個 - 但有方法組,更具體的一組參數來委託類型具有更一般的一組參數轉換。 (它的工作原理其他方式確定返回類型。)

現在C#4改變了這種略帶,因爲從(比方說)Action<string>Action<object>轉換 - 但這發生的一般代表,在以下方面他們的類型參數。

0

我想在.NET 1.1中無法使用委託反轉換(將EventHandler委派給DataArrivalEventHandler)。它是可用,因爲.NET 2.0

(你的代碼看起來像.NET 1.1的代碼)

+0

這是.NET 4.0中的所有C# – dlras2 2010-07-08 20:40:15

0

命名

有事件的命名約定。在你的情況下,該事件應該命名爲DataArrived。在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/h0eyck3s(v=VS.71).aspx

代表

你有兩位代表對應該使用的事件:事件處理程序和事件處理<牛逼>

Multihtreading

如果您正在使用多線程,以下面的方式啓動你的事件。

public event EventHandler<MyEventArgs> = delegate {}; 

以這種方式,您不必擔心多線程問題。