2010-07-08 55 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 {}; 

以这种方式,您不必担心多线程问题。