Строка из байтового перечисления

Возможный дубликат:
С# 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");
    }
}

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