如何在C#中基于现有的委托类型创建新的委托类型?

时间:2009-05-14 06:25:31

标签: c# inheritance delegates

有什么方法可以根据现有的委托类型创建新的委托类型?就我而言,我想创建一个与MyMouseEventDelegate具有相同功能的委托EventHandler<MouseEventArgs>

为什么我要这个?当然,要利用编译时类型检查!这样,我可以有两个不同的代表:MyRightClickHandlerMyLeftClickHandler,并且永远不会混淆twain - 即使它们在功能上与EventHandler<MouseEventArgs>相同。

是否有语法来做这类事情?

哦,代码如下:

using MyRightClickHandler = EventHandler<MouseEventArgs>

不够好。它不进行任何类型检查,因为它实际上不会创建新类型。我必须将这样的一行粘贴到我将引用MyRightClickHandler的每个代码文件中。

4 个答案:

答案 0 :(得分:13)

嗯,就像从原始版本复制委托声明一样简单。 C#中没有任何内容可以自动执行此操作,但我认为这不是一个负担:

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

MouseEventHandler不会很快改变......

你是否因为在错误的地方使用错误的代表而被误咬了?我不记得自己曾经发现过这个问题,而且在我看来,你们正在推出更多的工作(以及其他开发人员的一组不熟悉的代表) - 你确定它值得吗?

答案 1 :(得分:6)

我只想实现编译时类型检查我想这对于你描述的案例创建专门的EventArgs类就足够了。这样你仍然可以利用预定义的代表:

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

EventHandler<RightMouseButtonEventArgs>
EventHandler<LeftMouseButtonEventArgs>

答案 2 :(得分:4)

没有。根据{{​​3}},委托类型是密封的,您无法创建从现有委托类型继承的新委托类型。

答案 3 :(得分:2)

我不相信jon-skeet。我必须自己尝试一下。他是对的。

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.
}

那不是很明显!