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

Sha*_*mer 17 c# inheritance delegates

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

我为什么要这个?当然,要利用编译时类型检查!通过这种方式,我可以拥有两个不同的代表:MyRightClickHandler并且MyLeftClickHandler,并且永远不会混淆twain - 即使它们在功能上都相同EventHandler<MouseEventArgs>.

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

哦,代码如下:

using MyRightClickHandler = EventHandler<MouseEventArgs>
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 15

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

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e);
public delegate void MyRightClickHandler(object sender, MouseEventArgs e);
Run Code Online (Sandbox Code Playgroud)

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

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


One*_*aut 7

不可以。根据C# 文档,委托类型是密封的,您不能创建从现有委托类型继承的新委托类型。


Fre*_*örk 6

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

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

EventHandler<RightMouseButtonEventArgs>
EventHandler<LeftMouseButtonEventArgs>
Run Code Online (Sandbox Code Playgroud)