С#, используя числа в перечислении

Надеюсь, скоро.

Это допустимое перечисление

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,
};

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

Ответ 1

Никакой идентификатор вообще в С# не может начинаться с числа (для лексических/разборных причин). Подумайте о добавлении атрибута [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();
}

Для вас важно, хотите ли вы сделать это методом расширения, а в реализации выше я сделал его резервным для нормального имени enum, если не было предоставлено [DescriptionAttribute].

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

myEnum.OneA.GetDescription()

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

    • Дело имеет значение (то есть буквы верхнего и нижнего регистра). С# деликатный случай; таким образом, количество имен и граф ссылаются на два разных переменные.

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

Ответ 6

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

Ответ 7

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

  • Создать пространство имен enums, которое будет использоваться в цикле "для".
public enum TrayLevelCodes
    {
        None,
        _5DGS,
        _5DG,
        _3DGS,
        _3DG,
        _AADC,
        _ADC,
        _MAAD,
        _MADC
    };
  1. Создание строк на основе enum, созданных для использования для запроса Linq
public string _5DGS = "\"5DGS\"",
        _5DG = "\"5DG\"",
        _3DGS = "\"3DGS\"",
        _3DG = "\"3DG\"",
        _AADC = "\"AADC\"",
        _ADC = "\"ADC\"",
        _MAAD = "\"MAAD\"",
        _MADC = "\"MADC\"";
  1. Создайте функцию, которая примет значение перечисления в качестве аргумента и вернет соответствующую строку для запроса 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;
        }
  1. Вот как я использую то, что я создал выше.
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)
    {

    }
}