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 th
I didn't believe jon-skeet. I had to try it for myself. He was right.
public void F(object sender, MouseEventArgs e) {};
public MyLeftClickHandler l;
public MyRightClickHandler r;
public void Test()
{
l = F; // Automatically converted.
r = F; // Automatically converted to a different type.
l = r; // Syntax error. Incompatible types.
l = new MyLeftClickHandler(r); // Explicit conversion works.
}
That wasn't obvious!
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?
No. According to the C# documentation, delegate types are sealed, and you cannot create a new delegate type that inherits from an existing one.
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>