代码之家  ›  专栏  ›  技术社区  ›  Shalom Craimer

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

  •  16
  • Shalom Craimer  · 技术社区  · 17 年前

    是否有任何方法可以基于现有委托类型创建新的委托类型?在我的情况下,我想创建一个代理 MyMouseEventDelegate 其功能与 EventHandler<MouseEventArgs> .

    我为什么要这个?利用 编译时类型检查 当然!这样,我可以有两个不同的代表: MyRightClickHandler MyLeftClickHandler 而且,不要混淆这两个twain——即使它们在功能上都与 事件处理程序<mouseEventArgs> .

    有语法来做这种事情吗?

    哦,代码如下:

    using MyRightClickHandler = EventHandler<MouseEventArgs>
    

    不够好。它不进行任何类型检查,因为它实际上没有创建新的类型。我必须把这样的一行粘贴到我要引用的每个代码文件中 鼠标右键单击处理程序 .

    4 回复  |  直到 17 年前
        1
  •  13
  •   Jon Skeet    17 年前

    好吧,这就像复制原始的委托声明一样简单。C中没有自动执行此操作的功能,但我看不出这是一个很大的负担:

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

    它不像 MouseEventHandler 很快就会改变…

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

        2
  •  5
  •   Fredrik Mörk    17 年前

    我只想实现编译时类型检查,我想这足以为您描述的情况创建专门的EventArgs类。这样,您仍然可以利用预定义的代理:

    class RightMouseButtonEventArgs : MouseEventArgs {}
    class LeftMouseButtonEventArgs : MouseEventArgs {}
    
    EventHandler<RightMouseButtonEventArgs>
    EventHandler<LeftMouseButtonEventArgs>
    
        3
  •  4
  •   Oneironaut    10 年前

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

        4
  •  3
  •   Community Mohan Dere    9 年前

    我不相信 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.
    }
    

    那不明显!