【问题标题】:How do I create a new delegate type based on an existing one, in C#?如何在 C# 中基于现有的委托类型创建新的委托类型?
【发布时间】:2016-09-06 00:21:41
【问题描述】:

有什么方法可以基于现有的委托类型创建新的委托类型?就我而言,我想创建一个委托 MyMouseEventDelegate,它与 EventHandler<MouseEventArgs> 具有相同的功能。

我为什么要这个?当然,要利用编译时类型检查!这样,我可以有两个不同的代表:MyRightClickHandlerMyLeftClickHandler,并且永远不会混淆这两个代表 - 即使它们在功能上都与 EventHandler<MouseEventArgs> 相同。

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

哦,还有这样的代码:

using MyRightClickHandler = EventHandler<MouseEventArgs>

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

【问题讨论】:

  • 我已经修改了标题,以明确您在谈论委托类型,而不是委托实例。希望你不要介意。

标签: c# inheritance delegates


【解决方案1】:

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

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

MouseEventHandler 不会很快改变...

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

【讨论】:

  • 哇。我想我下次应该思考并使用更好的常识:-)
  • 这不是负担,但它不允许代表多态。
【解决方案2】:

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

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

EventHandler<RightMouseButtonEventArgs>
EventHandler<LeftMouseButtonEventArgs>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      这并不明显!

      【讨论】:

      • “我不相信jon-skeet :giggle:
      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 2023-03-05
      • 2011-04-09
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多