С#, используя числа в перечислении
Надеюсь, скоро.
Это допустимое перечисление
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
Перечисления не отличаются от переменных с точки зрения правил именования. Поэтому вы не можете запустить имя с помощью номера. Из этот пост, вот основные правила для именования переменных.
Ответ 6
Идентификаторы не могут начинаться с цифр. Однако они могут содержать числа.
Ответ 7
Вот что я предложил в качестве альтернативы, где мне нужно, чтобы Enums использовали в цикле "for" и строковое представление, эквивалентное использованию в запросе Linq.
- Создать пространство имен enums, которое будет использоваться в цикле "для".
public enum TrayLevelCodes
{
None,
_5DGS,
_5DG,
_3DGS,
_3DG,
_AADC,
_ADC,
_MAAD,
_MADC
};
- Создание строк на основе enum, созданных для использования для запроса 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)
{
}
}