如何在C#中基于现有的委托类型创建新的委托类型?
有没有办法可以根据现有的委托类型创建新的委托类型? 在我的例子中,我想创建一个委托MyMouseEventDelegate
,它具有与EventHandler
相同的function。
我为什么要这个? 当然,要利用编译时类型检查 ! 这样,我可以有两个不同的委托: MyRightClickHandler
和MyLeftClickHandler
,并且永远不会混淆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. }
那不是很明显!