C#中的枚举空格问题

16

有没有办法在C#枚举常量中加入空格?我读过可以在VB中通过以下方式实现:

Public Enum EnumWithSpaces
  ConstantWithoutSpaces
  [Constant With Spaces]
End Enum

...然后可以像这样访问它:

Public Sub UsingEnumWithSpaces()

  Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces]

End Sub

这意味着CLR可以处理带有空格的枚举。

在C#中是否有任何方法可以实现这一点?


在另一个帖子中的相关回答 - 我的枚举类型可以有友好的名称吗? - RBT
3个回答

37

这篇博客可能会对你有所帮助:

http://blog.spontaneouspublicity.com/2008/01/17/associating-strings-with-enums-in-c/

从文章中可以了解到:

但是在 C# 中枚举不能有空格。 你说。好吧,我喜欢使用 System.ComponentModel.DescriptionAttribute 来为枚举值添加更友好的描述。 可以将示例枚举重写如下:

public enum States
{
    California,
    [Description("New Mexico")]
    NewMexico,
    [Description("New York")]
    NewYork,
    [Description("South Carolina")]
    SouthCarolina,
    Tennessee,
    Washington
}

请注意,我不会在项目的描述中添加任何信息,在该项目的ToString()方法可以显示正确的情况下。


感谢Judah为我尝试整理这个代码。我一直在努力让它看起来正确。 - Joel Marcey
2
如果ToString自动使用属性,那就太好了。但事实上,它并不是非常有用。 - Steven Sudit
我猜你可以总是使用 DescriptionAttributeToDescription 扩展方法。 - cdmckay
这种方法对于调用Enum.Parse(Type enumType, string value)是失败的。值必须仍然是变量名而不是描述。这很遗憾。 - Ben

9

CLR可以处理标识符中的任何字符。然而,C#将标识符字符限制为CLS合法的字符,其中空格不属于合法字符。顺便说一下,VB.NET也是如此-在VB6中,方括号内的空格是可以使用的,但在VB.NET中则不能。


你能否通过反射修改枚举常量? - cdmckay
你是指加载已编译的程序集并处理以替换枚举名称,还是在运行时修改常量?后者是不可能的;前者则可以,但我认为使用 ildasm 对其进行反汇编,根据需要替换名称(这可以通过正则表达式自动化),然后使用 ilasm 将其再次编译为程序集会更简单。或者,您可以在 IL 中声明枚举,使用 ilasm 将其编译为 .netmodule,然后将该模块链接到您的 C#/VB 程序集中。 - Pavel Minaev
我最终只使用了“DescriptionAttribute”,然后编写了自己的静态类来访问枚举,就好像“DescriptionAttribute”是常量一样。 - cdmckay

0
如果您正在使用Visual C# 3.0或更高版本,我发现只需扩展枚举类并使用正则表达式在必要的位置插入空格即可方便地处理:
public static class EnumExtension
{
    public static String ToDisplayString(this Enum e)
    {
        Regex regex = new Regex(@"([^\^])([A-Z][a-z$])");

        return regex.Replace(e.ToString(), new MatchEvaluator(m =>
        {
            return String.Format("{0} {1}", m.Groups[1].Value, m.Groups[2].Value);
        }));
    }
}

注意,这使您能够直接使用任何枚举,而无需为每个值添加描述。

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();

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