views:

821

answers:

2

Is there any way that I can create a new delegate type based on an existing one? In my case, I'd like to create a delegate MyMouseEventDelegate which would have the same functionality as EventHandler<MouseEventArgs>.

Why do I want this? To take advantage of compile-time type-checking, of course! This way, I can have two different delegates: MyRightClickHandler and MyLeftClickHandler, and never the twain shall be confused - even if they are both functionally identical to EventHandler<MouseEventArgs>.

Is there syntax to do this sort of thing?

Oh, and code like:

using MyRightClickHandler = EventHandler<MouseEventArgs>

isn't good enough. It doesn't do any type-checking, since it doesn't actually create a new type. And I'd have to paste such a line into every code file in which I would refer to MyRightClickHandler.

+4  A: 

Well, it's as simple as copying the delegate declaration from the original. There's nothing in C# to do this automatically, but I can't see it's much of a burden:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e);
public delegate void MyRightClickHandler(object sender, MouseEventArgs e);

It's not like MouseEventHandler is going to change any time soon...

Have you actually been bitten by bugs due to using the wrong delegates in the wrong places though? I can't remember ever having found this a problem myself, and it seems to me you're introducing more work (and an unfamiliar set of delegates for other developers) - are you sure it's worth it?

Jon Skeet
Wow. I guess I ought to think and use better common-sense next time :-)
scraimer
+3  A: 

I you only want to achieve compile time type checking I guess it would be enough to create specialized EventArgs classes for the cases that you describe. That way you can still take advantage of the pre-defined delegates:

class RightMouseButtonEventArgs : MouseEventArgs {}
class LeftMouseButtonEventArgs : MouseEventArgs {}

EventHandler<RightMouseButtonEventArgs>
EventHandler<LeftMouseButtonEventArgs>
Fredrik Mörk