我已经读过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>
我是如何做到最好的方法,还是有更好的约定?
答案 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 {};
通过这种方式,您不必担心多线程问题。