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

1

3 Answers 3

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.

Sign up to request clarification or add additional context in comments.

4 Comments

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

3 Comments

Is there anyway you could modify an enum constant using reflection?
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.
I ended up just using the DescriptionAttribute and then writing my own static class for accessing the enum as if the DescriptionAttributes were the constants.
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(); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.