Пробелы в С# Enums

Есть ли способ поместить пробелы в константу перечисления С#? Я читал, что вы можете сделать это в VB, сделав это:

Public Enum EnumWithSpaces
  ConstantWithoutSpaces
  [Constant With Spaces]
End Enum

... и затем получить доступ к нему следующим образом:

Public Sub UsingEnumWithSpaces()

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

End Sub

Это означает, что CLR может обрабатывать перечисление с пробелами.

Есть ли способ сделать это в С#?

Ответы

Ответ 1

Это сообщение в блоге может помочь вам:

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

Из статьи:

Но перечисления не могут иметь пробелы в С#! " ты говоришь. Хорошо, мне нравится использовать System.ComponentModel.DescriptionAttribute добавить более дружелюбное описание к значения перечисления. Пример перечисления может переписываться следующим образом:

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

Обратите внимание, что я не помещаю описания элементов, где версия ToString() этого элемента отображается просто отлично.

Ответ 2

CLR может обрабатывать абсолютно любой символ в идентификаторах. Тем не менее, С# ограничивает символы идентификатора теми, что легальны в CLS, в котором нет места. То же самое касается VB.NET, между прочим - пробелы внутри квадратных скобок, используемые для работы в VB6, но они не в VB.NET.

Ответ 3

Если вы работаете с Visual С# 3.0 или выше, мне было удобно просто расширять класс enum и использовать регулярное выражение для вставки пробелов, где это необходимо:

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