枚举类型可以包含字符串吗?

16

我该如何声明一个包含字符串值的enum

private enum breakout {            
    page = "String1",
    column = "String2",
    pagenames = "String3",
    row = "String4"
}
6个回答

20

不,它们不能。它们被限制为底层枚举类型的数字值。

但是,您可以通过一个辅助方法获得类似的行为。

public static string GetStringVersion(breakout value) {
  switch (value) {
    case breakout.page: return "String1";
    case breakout.column: return "String2";
    case breakout.pagenames: return "String3";
    case breakout.row: return "String4";
    default: return "Bad enum value";
  }
}

3
+1 带有辅助方法的好代码! - Rob
1
如果不想使用自定义字符串,ToString("F") 对于格式化枚举值的名称非常有用。 - Grant Thomas
是的,我刚才有点走神了。我试了一下我之前提到的东西,现在我记不清我当时具体在想什么了。 - Chris Walsh
1
@Chris 我相信某些工具,如R#或FxCop可能提供此行为。不过我记不太清了。 - JaredPar
@JaredPar 很不错!一个动态+通用版本会很好。接受一个 dictionary<userenum,string> 并在C#或IL-Emit中实现这个超高性能版本。也许已经有人实现了类似的东西? - Lorenz Lo Sauer
显示剩余4条评论

13

正如其他人所说,不行。

你可以这样做静态类:

internal static class Breakout {
    public static readonly string page="String1";
    public static readonly string column="String2";
    public static readonly string pagenames="String3";
    public static readonly string row="String4";

    // Or you could initialize in static constructor
    static Breakout() {
        //row = string.Format("String{0}", 4);
    }
}

或者

internal static class Breakout {
    public const string page="String1";
    public const string column="String2";
    public const string pagenames="String3";
    public const string row="String4";
}

使用readonly,您可以在静态构造函数中实际分配值。当使用const时,它必须是一个固定的字符串。
或者将DescriptionAttribute分配给枚举值,就像这里一样。

我会把它们设为只读或常量。 - vcsjones
+1 虽然在这种情况下 conststatic 更好。 - Davy8
@vcsjones和@Davy - 很好的观点。我本来想包括readonly的,但是忘记了。 - CodeNaked
+1 是用于描述属性的。 - vgru

8
不可以,但是你可以将枚举值转换为字符串: Enum.ToString 方法
private enum Breakout {     
  page,
  column,
  pagenames,
  row
}

Breakout b = Breakout.page;
String s = b.ToString(); // "page"

2

默认情况下,枚举的底层类型为整数类型,这也在msdn上这里说明。


2
也许 Enum.GetName()/Enum.GetNames() 对您有帮助。

这些方法通过反射工作。此时,最好使用汇编元数据,但访问速度较慢。 枚举类型之所以存在是因为它们的性能表现。 - Lorenz Lo Sauer

1
你可以创建一个枚举字典。
public enum OrderType
{
    ASC,
    DESC
}

public class MyClass
{
    private Dictionary<OrderType, string> MyDictionary= new Dictionary<OrderType, string>()
                                                     {
                                                         {OrderType.ASC, ""},
                                                         {OrderType.DESC, ""},
                                                     };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接