C # с использованием чисел в перечислении - PullRequest
33 голосов
/ 12 октября 2010

Надеюсь, быстро.

Это действительное перечисление

public enum myEnum
{
  a= 1,
  b= 2,
  c= 3,
  d= 4,
  e= 5,
  f= 6,
  g= 7,
  h= 0xff
};

Но это не

public enum myEnum
{
  1a = 1,
  2a = 2,
  3a = 3,
};

Есть ли способ использовать число в перечислении. У меня уже есть код для заполнения выпадающих списков, так что это было бы очень удобно

Ответы [ 7 ]

72 голосов
/ 12 октября 2010

Никакой идентификатор в C # не может начинаться с цифры (по лексическим причинам / для разбора). Попробуйте добавить атрибут [Description] к вашим значениям перечисления:

public enum myEnum
{
    [Description("1A")]
    OneA = 1,
    [Description("2A")]
    TwoA = 2,
    [Description("3A")]
    ThreeA = 3,
};

Тогда вы можете получить описание из значения перечисления, например:

((DescriptionAttribute)Attribute.GetCustomAttribute(
    typeof(myEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
        .Single(x => (myEnum)x.GetValue(null) == enumValue),    
    typeof(DescriptionAttribute))).Description

Основываясь на комментариях XSA ниже, я хотел бы расширить, как можно сделать это более читабельным. Проще всего, вы можете просто создать статический (расширение) метод:

public static string GetDescription(this Enum value)
{
    return ((DescriptionAttribute)Attribute.GetCustomAttribute(
        value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)
            .Single(x => x.GetValue(null).Equals(value)),
        typeof(DescriptionAttribute)))?.Description ?? value.ToString();
}

Вам решать, хотите ли вы сделать его методом расширения, и в приведенной выше реализации я сделал его запасным по отношению к обычному имени перечисления, если не было предоставлено [DescriptionAttribute].

Теперь вы можете получить описание для перечисления через:

myEnum.OneA.GetDescription()
11 голосов
/ 12 октября 2010

Нет, нет.C # не позволяет идентификаторам начинаться с цифры.

Замечание по удобству использования приложения: в вашем приложении вы все равно не должны отображать идентификаторы кода для конечного пользователя.Подумайте о переводе отдельных элементов перечисления в удобные для отображения тексты.Рано или поздно вам придется расширять перечисление элементом, идентификатор которого не будет в форме, отображаемой для пользователя.

ОБНОВЛЕНИЕ: Обратите внимание, что способ прикрепления отображаемых текстовк элементам перечисления идет речь, например, здесь .

9 голосов
/ 12 октября 2010

Идентификатор в C # (и большинстве языков) не может начинаться с цифры.

Если вы можете изменить код, который заполняет раскрывающийся список именами перечисления, возможно, у вас есть хак, который удаляет ведущийподчеркните при заполнении выпадающего списка и определите свой enum следующим образом:

public enum myEnum
{
  _1a = 1,
  _2a = 2,
  _3a = 3
};

Или, если вам не нравятся подчеркивания, вы можете придумать свою собственную схему «префикс-быть-раздетым» (может быть, пройтипрефикс к конструктору или методу, который заполняет раскрывающийся список из перечисления).

4 голосов
/ 12 октября 2010

Идентификаторы не могут начинаться с цифр.Однако они могут содержать цифры.

4 голосов
/ 12 октября 2010

Перечисления ничем не отличаются от переменных с точки зрения правил именования.Поэтому вы не можете начать имя с цифры.Начиная с этого поста , приведены основные правила именования переменных.

  • Имя может содержать буквы, цифры и знак подчеркивания (_).

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

    • Регистр имеет значение (то есть заглавные и строчные буквы).C # чувствителен к регистру;таким образом, имена count и Count относятся к двум различным переменным.

    • C # ключевые слова не могут использоваться в качестве имен переменных.Напомним, что ключевое слово - это слово, которое является частью языка C #.(Полный список ключевых слов C # можно найти в Приложении B, «Ключевые слова C #».)

4 голосов
/ 12 октября 2010

Ни за что.Допустимый идентификатор (т. Е. Действительный член перечисления) не может начинаться с цифры.

0 голосов
/ 20 марта 2014

Вот то, что я придумал в качестве альтернативы, где мне нужно, чтобы Enums использовал в цикле «for» и строковое представление, эквивалентное для использования в запросе Linq.

  1. Создайте пространство имен перечислений для использования в цикле "for".
public enum TrayLevelCodes
    {
        None,
        _5DGS,
        _5DG,
        _3DGS,
        _3DG,
        _AADC,
        _ADC,
        _MAAD,
        _MADC
    };
Создание строк на основе перечисления, созданного для использования в запросе Linq
public string _5DGS = "\"5DGS\"",
        _5DG = "\"5DG\"",
        _3DGS = "\"3DGS\"",
        _3DG = "\"3DG\"",
        _AADC = "\"AADC\"",
        _ADC = "\"ADC\"",
        _MAAD = "\"MAAD\"",
        _MADC = "\"MADC\"";
Создать функцию, которая будет принимать значение перечисления в качестве аргумента и возвращать соответствующую строку для запроса Linq.
public string GetCntnrLvlDscptn(TrayLevelCodes enumCode)
        {
            string sCode = "";
            switch (enumCode)
            {
                case TrayLevelCodes._5DGS:
                    sCode = "\"5DGS\"";
                    break;
                case TrayLevelCodes._5DG:
                    sCode = "\"5DG\"";
                    break;
                case TrayLevelCodes._3DGS:
                    sCode = "\"3DGS\"";
                    break;
                case TrayLevelCodes._3DG:
                    sCode = "\"3DG\"";
                    break;
                case TrayLevelCodes._AADC:
                    sCode = "\"AADC\"";
                    break;
                case TrayLevelCodes._ADC:
                    sCode = "\"AAC\"";
                    break;
                case TrayLevelCodes._MAAD:
                    sCode = "\"MAAD\"";
                    break;
                case TrayLevelCodes._MADC:
                    sCode = "\"MADC\"";
                    break;
                default:
                    sCode = "";
                    break;
            }
                return sCode;
        }
Вот как я использую то, что я создал выше.
for (var trayLevelCode = TrayLevelCodes._5DGS; trayLevelCode <= TrayLevelCodes._MADC; trayLevelCode++)
{
    var TrayLvLst = (from i in pair1.Value.AutoMap
                     where (i.TrayLevelCode == HTMLINFO.GetCntnrLvlDscptn(trayLevelCode))
                     orderby i.TrayZip, i.GroupZip
                     group i by i.TrayZip into subTrayLvl
                     select subTrayLvl).ToList();
    foreach (DropShipRecord tray in TrayLvLst)
    {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...