开发者

EventHandler Design Practices

I've read that one benefit to the MyEventHandler/MyEventArgs model is that it allows standard event handlers to handle a variety of events. It sounds good, but perhaps I'm understanding how this is supposed to work. I have the following code:

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

public class DataArrivalEvent开发者_开发知识库Args : 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)
{
    ...
}

The code throws an error when I'm trying to add the event handler, however, saying that it cannot implicity cast DataArrivalEventHandler to EventHandler. Changing DataArrivalEventHandler(Pipe_DataArrival) to EventHandler(Pipe_DataArrival) fixes the problem, so I feel like you should be able to add generic event handlers to more specific events (I understand why you can't do it the other way around.)

Is how I have it the best way to do it, or is there a better convention?


The way you've got it is right.

There's no conversion from a more specific delegate type to a more general one - but there is a conversion from a method group with a more specific set of parameters to a delegate type with a more general set of parameters. (It works the other way for return types.)

Now C# 4 changes this slightly, as there is a conversion from (say) Action<string> to Action<object> - but this only happens for generic delegates, in terms of their type parameters.


I think delegate contravariance (assigning EventHandler delegate to DataArrivalEventHandler) does not work in .NET 1.1. It is available since .NET 2.0

(Your code looks like .NET 1.1 code)


Naming

There are a naming convention for events. In your case the event should be named DataArrived. Read more here: http://msdn.microsoft.com/en-us/library/h0eyck3s(v=VS.71).aspx

Delegates

You got two delegates for events that should be used: EventHandler and EventHandler<T>

Multihtreading

If you are using multithreading, init your event in the following way.

public event EventHandler<MyEventArgs> = delegate {};

In this way you don't have to worry about multithreading issues.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜