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

有没有办法可以根据现有的委托类型创建新的委托类型? 在我的例子中,我想创建一个委托MyMouseEventDelegate ,它具有与EventHandler相同的function。

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

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

哦,代码如下:

 using MyRightClickHandler = EventHandler 

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

嗯,就像从原始复制委托声明一样简单。 C#中没有任何东西可以自动执行此操作,但我看不出它是一个很大的负担:

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

它不像MouseEventHandler会很快改变…

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

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

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

根据C#文档 ,委托类型是密封的,您无法创建从现有委托类型inheritance的新委托类型。

我不相信jon-diaet 。 我不得不亲自尝试一下。 他是对的。

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

那不是很明显!