Числовые константы в enum (c #) - PullRequest
1 голос
/ 14 марта 2011

Я создаю это окно выбора в веб-части SharePoint, и мне нужно иметь выпадающий список с текущей версией, поэтому мне нужно использовать Enum.

public enum SelectVersionEnum { 2010, 2007 };

Хорошо, вы можете видеть, где оно ломается,Есть ли способ использовать целые числа в перечислении?Больше всего я хотел бы использовать

public enum SelectVersionEnum { 2010=14, 2007=12 };

Ответы [ 5 ]

7 голосов
/ 14 марта 2011

Нет, нельзя перечислять перечисления целочисленными именами.

Имя значения перечисления является обычным идентификатором и должно следовать тем же правилам, что и все остальные.

Однако вы можете использовать:

public enum SelectVersionEnum
{
    Version2007 = 12,
    Version2010 = 14
}

Кроме того, Enum.Parse может анализировать строки с целыми числами в соответствующие им значения перечисления, даже если описанное в строке значение не существует.

Попробуйте следующее в LINQPad :

void Main()
{
    Enum.Parse(typeof(SelectVersionEnum), "12").Dump();
    Enum.Parse(typeof(SelectVersionEnum), "14").Dump();
    Enum.Parse(typeof(SelectVersionEnum), "2007").Dump();
}

public enum SelectVersionEnum
{
    Version2007 = 12,
    Version2010 = 14
}

Вывод:

Version2007
Version2010
2007

Как вы думаете, что произошло бы, если бы вы определили следующее:

public enum SelectVersionEnum
{
    12 = 14,
    14 = 16
}

Строка «14» теперь означает «12» или «14»?

7 голосов
/ 14 марта 2011

Члены Enum должны быть действительными идентификаторами C #.
Они не могут начинаться с цифр.

Вместо этого вы можете использовать что-то вроде Office2007, Office2010 или V2007, V2010.

3 голосов
/ 14 марта 2011

Нет, идентификаторы перечисления не могут начинаться с цифры.

2 голосов
/ 14 марта 2011

Вы можете добавить метод расширения к вашему enum как любой другой тип.

Таким образом, вы можете создать расширение для SelectVersionEnum, чтобы помочь вам получить значения перечисления в правильном формате ...

public static class SelectVersionEnumExtension
{
     public static int Version(this SelectVersionEnum enumValue)
     {
         return 0; // Obviously you should return something meaningful here..
     }
}

Это дает вам большую гибкость.

1 голос
/ 04 ноября 2016

Одним из способов получения числовых значений, связанных с перечислениями, является использование атрибута description.Например, у вас может быть перечисление:

[Serializable]
public enum SelectVersionEnum
{
    [Description("2007")]
    v2007,
    [Description("2010")]
    v2010
}

Затем вы можете написать метод расширения, чтобы получить искомое числовое значение.

public static string Description(this Enum value)
{
    var type = value.GetType();

    var name = Enum.GetName(type, value);

    if (name != null)
    {
        if (type.GetField(name) != null)
        {
            var attr = Attribute.GetCustomAttribute(type.GetField(name), typeof(DescriptionAttribute)) as DescriptionAttribute;

            return attr != null ? attr.Description : name;
        }
    }

    return null;

} // end

Вы можете использовать его следующим образом:

var version = SelectVersionEnum.v2007.Description();
...