Преобразовать перечисление в словарь но строка - это атрибут описания - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь преобразовать перечисление в Dictionary int - это значение, а строка - это описание значения.

У меня уже есть функция, которая получает описание перечисления по ее значению, но я не знаю, как используйте его с итерацией перечисления, которая у меня есть:

public static IDictionary<int, string> ConvertEnumToDictionary<K>()
        {
            Dictionary<int, string> mydic = new Dictionary<int, string>(); 
            foreach (K foo in Enum.GetValues(typeof(K)))
            {
                //???
                mydic.Add((int)foo, GetEnumDescription(foo));
            } 
        }

public static string GetEnumDescription(Enum value)
    {
        // Get the Description attribute value for the enum value
        FieldInfo fi = value.GetType().GetField(value.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attributes.Length > 0)
            return attributes[0].Description;
        else
            return value.ToString();
    }

  public enum Lu_LanguageTypes
        {
            [Description("Hebrew")]
            he = 1,
            [Description("Englishj")]
            en = 2,
            [Description("Spanish")]
            es = 3
        }

1 Ответ

2 голосов
/ 16 июня 2020

Вы можете немного изменить метод ConvertEnumToDictionary и применить ограничение where K : Enum generi c (доступно с C# 7.3) и привести значение Enum к K перед переходом к GetEnumDescription метод

public static IDictionary<int, string> ConvertEnumToDictionary<K>() where K : Enum
{
    var mydic = new Dictionary<int, string>();
    foreach (var foo in Enum.GetValues(typeof(K)))
    {
        mydic.Add((int)foo, GetEnumDescription((K)foo));
    }

    return mydic;
}

Пример использования, который дает словарь с 3 парами ключ-значение

var result = ConvertEnumToDictionary<Lu_LanguageTypes>();

Другой вариант - добавить ограничение к интерфейсу IConvertible. (поскольку тип Enum реализует это) и избегайте приведения

public static IDictionary<int, string> ConvertEnumToDictionary<K>() where K : Enum, IConvertible
{
    var mydic = new Dictionary<int, string>();
    foreach (K foo in Enum.GetValues(typeof(K)))
    {
        mydic.Add(foo.ToInt32(null), GetEnumDescription(foo));
    }

    return mydic;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...