有什么方法可以根据现有的委托类型创建新的委托类型?就我而言,我想创建一个与MyMouseEventDelegate
具有相同功能的委托EventHandler<MouseEventArgs>
。
为什么我要这个?当然,要利用编译时类型检查!这样,我可以有两个不同的代表:MyRightClickHandler
和MyLeftClickHandler
,并且永远不会混淆twain - 即使它们在功能上与EventHandler<MouseEventArgs>
相同。
是否有语法来做这类事情?
哦,代码如下:
using MyRightClickHandler = EventHandler<MouseEventArgs>
不够好。它不进行任何类型检查,因为它实际上不会创建新类型。我必须将这样的一行粘贴到我将引用MyRightClickHandler
的每个代码文件中。
答案 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.
}
那不是很明显!