tags:

views:

1842

answers:

2
+5  Q: 

Spaces in C# Enums

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#?

+6  A: 

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
Is there anyway you could modify an enum constant using reflection?
cdmckay
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
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
+12  A: 

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.

Joel Marcey
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
This would be nice if ToString automatically used the attribute. As it stands, though, it's not all that useful.
Steven Sudit
I guess you could always use the `DescriptionAttribute` along with a `ToDescription` extension method.
cdmckay