【问题标题】:Is it at all possible to extend System.Delegate?是否有可能扩展 System.Delegate?
【发布时间】:2009-04-15 16:11:34
【问题描述】:

在 C# 中不能从 System.Delegate 或 System.MulticastDelegate 继承。只要您声明标准的“运行时托管”方法,就完全可以在 MSIL 中执行此操作。但是,每次我向类型添加“cil 管理”方法时,我都会得到:

System.TypeLoadException:运行时实现的委托方法的定义非法。

是否可以扩展 Delegate/MulticastDelegate?

【问题讨论】:

  • 出于好奇,您想通过扩展 Delegate 类来添加什么?
  • 将 Target 和 Method 作为字符串(而不是 IntPtr)的构造函数。
  • 为什么不在其他地方有一个静态方法来做同样的事情呢?对我来说听起来要简单得多,而且对于维护代码的人来说也不那么出人意料。
  • 为了扩展 Jon 的建议,您似乎可以在这里使用工厂模式,至少将委托的创建从用户那里抽象出来,并获得您想要的调用模式。
  • 这就是我们在 CCC (Completely Cryptic Code), Inc. 中做事的方式:)

标签: delegates cil


【解决方案1】:

不使用您自己的自定义代码,在 C# 中。来自 C# 3.0 规范的第 10.1.4 节:

类类型的直接基类 不得为以下任何一项 类型:System.ArraySystem.DelegateSystem.MulticastDelegate, System.Enum, 或System.ValueType。此外,一个 泛型类声明不能使用 System.Attribute 直接或 间接基类。

但是,每次创建委托类型时,它都会自动派生自 MulticastDelegate

来自ECMA-335,第 8.9.3 节:

虽然在大多数情况下,代表 似乎只是另一种 用户定义的类,它们是紧密的 受控。的实施 方法由 VES 提供,而不是 用户代码。唯一的额外成员 可以在委托类型上定义 是静态或实例方法。

这听起来像是在禁止构造函数。我个人会使用普通类型的静态方法。

【讨论】:

    【解决方案2】:

    您可能有兴趣查看 Rick Strahl 的以下post,他在其中比较了不同的动态委托创建方法。

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多