0

我认为许多 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 枚举的现有代码,但如果我确定它不会发生并且使用这些功能的所有责任都在我身上。

你对这样的功能怎么办?

4

2 回答 2

3

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

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

于 2011-10-13T07:34:47.930 回答
0

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

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

于 2011-10-13T07:30:58.740 回答