16

Is there any way to put spaces in a C# enum constant? I've read that you can do it in VB by doing this:

Public Enum EnumWithSpaces
  ConstantWithoutSpaces
  [Constant With Spaces]
End Enum

...and then access it like this:

Public Sub UsingEnumWithSpaces()

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

End Sub

That implies to me that the CLR can handle an enum with spaces.

Is there any way to do this in C#?

cdmckay
  • 31,832
  • 25
  • 83
  • 114
  • Related answer on another post - [Can my enums have friendly names?](https://stackoverflow.com/a/1415460/465053) – RBT May 03 '21 at 11:13

3 Answers3

37

This blog post might help you:

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

From the article:

But enums can't have spaces in C#!" you say. Well, I like to use the System.ComponentModel.DescriptionAttribute to add a more friendly description to the enum values. The example enum can be rewritten like this:

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

Notice that I do not put descriptions on items where the ToString() version of that item displays just fine.

GEOCHET
  • 21,119
  • 15
  • 74
  • 98
Joel Marcey
  • 1,748
  • 14
  • 13
  • Thanks Judah for trying to clean this up for me. I was having a heck of a time trying to get it to look right. – Joel Marcey Jul 13 '09 at 03:04
  • 2
    This would be nice if ToString automatically used the attribute. As it stands, though, it's not all that useful. – Steven Sudit Jul 13 '09 at 04:48
  • I guess you could always use the `DescriptionAttribute` along with a `ToDescription` extension method. – cdmckay Jul 13 '09 at 06:53
  • This method fails for the call Enum.Parse(Type enumType, string value). The value must still be the variable name and not the description. Which is a shame. – Ben Oct 15 '15 at 10:30
9

CLR can handle absolutely any character in identifiers. However, C# restricts the identifier characters to those legal under the CLS, which space isn't. Same goes for VB.NET, by the way - spaces inside square brackets used to work in VB6, but they don't in VB.NET.

Pavel Minaev
  • 99,783
  • 25
  • 219
  • 289
  • Is there anyway you could modify an enum constant using reflection? – cdmckay Jul 13 '09 at 06:53
  • Do you mean loading a compiled assembly and processing it to replace enum names, or modifying the constant at run-time? The latter is not possible; the former is, but I think it would be far simpler to use `ildasm` to disassemble it, replace the names as needed (this can be automated with regex), and use `ilasm` to make it an assembly again. Alternatively, you can declare your enum in IL in the first place, use `ilasm` to compile it to a .netmodule, and then link that module into your C#/VB assembly. – Pavel Minaev Jul 14 '09 at 02:08
  • I ended up just using the `DescriptionAttribute` and then writing my own static class for accessing the enum as if the `DescriptionAttribute`s were the constants. – cdmckay Jul 14 '09 at 03:12
0

If you're working with Visual C# 3.0 or above I've found it convenient to just extend the enum class and use a regex to inset spaces where neccessary:

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);
        }));
    }
}

Notice this allows you to work with any enum as is without adding descriptions to every value.

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();
Micah Hahn
  • 400
  • 2
  • 11