Это хороший/безопасный способ конвертации перечислений?


В связи с тем, что предприятие не поддерживает перечислений, я превращая их в строки вновь, списки строк, и обратно.

Причина заключается в два раза: тип-безопасности, и последовательности в базе данных.

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

    public enum CreditCardName
    {
        VISA,
        Master_Card,
        Discover,
        American_Express
    }

Изначально, я решил писать один и тот же метод для них, снова и снова:

    public static List<string> GetCreditCardTypes()
    {
        var list = Enum.GetNames(typeof(CreditCardName));
        return list.Select(n => n.Replace("_", " ")).ToList();
    }

Потом мне пришло в голову, что я мог сделать один отдельный метод для этого:

    public static List<string> GetCreditCardTypes()
    {
        return EnumToList(typeof(CreditCardName));
    }


    private static List<string> EnumToList(Type type)
    {
        var list = Enum.GetNames(type);
        return list.Select(n => n.Replace("_", " ")).ToList();
    }

Теперь я тоже делаю нечто подобное в обратном, но будет пропускать код. У меня есть вопрос, если это хороший способ пойти об этом? Я знаю, что есть и другие обходные пути из-за отсутствия лица поддержка enum, но они немного громоздки для моих простых нужд. Я никогда не использовал видах таким образом, поэтому я просто хотел проверить, что это, как тип/вызова typeof предназначены, чтобы использоваться, и это не вызовет непредвиденных проблем во время выполнения.



942
5
задан 8 июля 2011 в 05:07 Источник Поделиться
Комментарии
1 ответ

Я решил аналогичную проблему, придумав атрибут DisplayName, поэтому я могу определить мои перечисления такой:

public enum CreditCardName
{
[DisplayName("VISA")]
Visa,

[DisplayName("MasterCard")]
MasterCard,

[DisplayName("Discover")]
Discover,

[DisplayName("American Express")]
AmericanExpress
}

Это имеет ряд преимуществ. Например, такие приложения, как для ReSharper, перестанут жаловаться на свою схему именования. Кроме того, строки не должны фактически соответствовать английское имя, он может соответствовать запись в файл строки перевода или что-то подобное.

Источник для DisplayName:

[AttributeUsage(AttributeTargets.Field)]
public class DisplayName : Attribute
{
public string Title { get; private set; }

public DisplayName(string title)
{
this.Title = title;
}
}

Источник для метод, чтобы получить ваши объекты отображаемое имя

        IEnumerable<DisplayName> attributes = from attribute in typeof(CreditCardName).GetCustomAttributes(true)
let displayName = attribute as DisplayName
where displayName != null
select displayName;

Вы можете свернуть это в более полной универсального метода тоже:

public string[] GetNames<TEnum>()
{
return (from attribute in typeof(CreditCardName).GetCustomAttributes(true)
let displayName = attribute as DisplayName
where displayName != null
select displayName.Title).ToArray();
}

Unfortuately, я там не способ можно применить, что TEnum-перечислимый во время компиляции, но вы могли бы сделать это вместо того, чтобы бросать исключение.

9
ответ дан 8 июля 2011 в 02:07 Источник Поделиться