Строка из байтового перечисления
Возможный дубликат:
С# Enums - могут ли мои перечисления иметь дружеские имена?
Вставить строку для перечисления с атрибутом enum
У меня есть перечисление с байтовыми значениями:
enum MarketingEventType : byte {MARKETING_CAMPAIGN, TELESALES, MARKETING_ACTIONS};
Я бы хотел указать для всего имени элемента, которое я получу по методу ToSting().
Например:
MarketingEventType.TELESALES.ToString(); // I get "bla bla bla"
MarketingEventType.MARKETING_ACTIONS.ToString(); // I get "la la la"
Возможно ли без изменения тип перечисления от BYTE до STRING?
Ответы
Ответ 1
Вы не можете установить тип перечисления на string
. Допустимые базовые типы: t21, t2, t2,
Однако вы можете использовать атрибут Description
:
enum MarketingEventType
{
[Description("bla bla bla")]
TELESALES,
}
Извлечение описания перечисления - это беспорядок, но вы можете использовать этот метод (или даже сделать из него метод расширения!):
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(
typeof(DescriptionAttribute),
false);
if (attributes != null &&
attributes.Length > 0)
return attributes[0].Description;
else
return value.ToString();
}
Ответ 2
Если все, что вам нужно, это "МАРКЕТИНГ" и "ТЕЛЕСНАЛЫ", вы должны выполнить
MarketingEventType.TELESALES.ToString();
... как у вас в вопросе.
Если вы хотите, чтобы базовые значения байтов "0" и "1", вы выполнили бы
MarketingEventType.TELESALES.ToString("d");
Ответ 3
Почему бы просто не создать метод, который вернет строку для вашего значения перечисления?
public string GetMarketingEventName(MarketingEventType eventType)
{
switch(eventType)
{
case MarketingEventType.MARKETING_CAMPAIGN: return "blah blah blah";
case MarketingEventType.TELESALES: return "lalala";
case MarketingEventType.MARKETING_ACTIONS: return "boo";
default:
throw new ArgumentException("eventType");
}
}
Зачем вам это делать? Потому что вам нужна строка для отображения в пользовательском интерфейсе, и это хорошая практика для разделения пользовательского интерфейса из домена. Итак, я думаю, что такой метод на классе контроллера лучше, чем атрибуты в вашем домене. Также рассмотрим вопрос о локализации.