EventHandler设计实践

时间:2010-07-08 20:20:29

标签: c# events

我已经读过MyEventHandler / MyEventArgs模型的一个好处是它允许标准事件处理程序处理各种事件。这听起来不错,但也许我正在理解它应该如何工作。我有以下代码:

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)可以解决问题,因此我觉得您应该能够将通用事件处理程序添加到更具体的事件中(我明白为什么不能以相反的方式执行此操作。)< / p>

我是如何做到最好的方法,还是有更好的约定?

3 个答案:

答案 0 :(得分:0)

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

没有从更具体的委托类型转换为更一般的委托类型 - 但是 方法组转换为具有更具体的参数集使用更一般的参数集委托类型。 (它以返回类型的另一种方式工作。)

现在C#4略有改变,因为 从({)Action<string>转换为Action<object> - 但此发生了通用代表,就其类型参数而言。

答案 1 :(得分:0)

我认为委托逆向(将EventHandler委托分配给DataArrivalEventHandler)在.NET 1.1中不起作用。它自.NET 2.0起可用

(您的代码看起来像.NET 1.1代码)

答案 2 :(得分:0)

<强>命名

事件的命名约定。在您的情况下,该事件应命名为DataArrived。在此处阅读更多内容:http://msdn.microsoft.com/en-us/library/h0eyck3s(v=VS.71).aspx

<强>代表

您有两个代表应该使用的事件:EventHandler和EventHandler&lt; T&gt;

<强> Multihtreading

如果您正在使用多线程,请按以下方式启动您的活动。

public event EventHandler<MyEventArgs> = delegate {};

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