【问题标题】:Why does not exists enum-extensions in C#?为什么 C# 中不存在枚举扩展?
【发布时间】:2011-12-06 17:39:16
【问题描述】:

我认为许多 C# 开发人员都遇到过这样的问题:标准 .net 库中存在一些枚举以及许多标准类及其使用它们的方法。但是如果你想通过添加一些不可能的字段来扩展这个枚举,但是它可以有效地简化开发过程并且不会干扰那些标准类的工作。我用具体的例子来描述它: System.Diagnostics 命名空间中有一个枚举 TraceOptions,它由 TraceListeners 使用。让我们想用一些额外的选项(如 AssemblyName 等)来设计 Listener。现在我必须创建新的枚举,其中包含我所有的额外选项,这些选项补充了 TraceOptions 枚举中的选项。然后将新属性 ExtraTraceOptions 添加到我的 Listener。但是如果我能写出这样的东西呢:

enum MyExtraEnum : TraceOptions
{
  AssemblyName = 128
}

MyExtraEnum 将通过新字段扩展 TraceOptions,这些字段不得与 TraceOptions 的字段相交,也不能与名称相交,也不能与值相交。然后我可以将 TraceOptions 与新字段一起使用,例如:

     TraceOptions t = TraceOptions.AssemblyName; (IntelliSense may display that this 
field is extended field from MyExtraEnum enumeration)

我知道这可能会破坏使用 TraceOptions 枚举的现有代码,但如果我确定它不会发生并且使用此类功能的所有责任都在我身上。

你怎么处理这样的功能?

【问题讨论】:

  • 这有点违背枚举的目的。

标签: c# .net language-features feature-detection


【解决方案1】:

你不能从一个枚举继承,所有的枚举都是隐式密封的。因此,没有简单的方法可以为枚举添加额外的值(如果这是您想要做的)。您必须定义一个新的枚举。

如果您想向枚举添加额外的方法,您可以使用扩展方法,但这是您扩展它们的唯一方法。

【讨论】:

    【解决方案2】:

    对我来说这听起来不是一个好主意。所以现在 C# 6 出来了,TraceOptions 有了一个新特性:SomeFoo = 128。或者可能是AssemblyName = 127。现在您遇到了冲突,这(与常规子类化不同)TraceOptions 的提供者没有预料到。

    枚举提供了一组有限的选项,枚举的作者支持这些选项。说你承担全部责任是不够的。这就像要求所有成员变量都是公开的,说明你永远不会滥用它们。这不是一种安全的编程方法。

    【讨论】:

    • 但这可能发生在所有扩展方法上,而不仅仅是枚举......
    • @JoanCharmant,好点,但在值部分仍然存在很大差异。如果枚举使用值 1-9,则值 10 可能会被扩展和下一个版本的枚举使用。名称冲突的可能性要低得多,这是扩展方法的唯一问题。
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多