Перечислите в словарь и отформатируйте каждое имя - PullRequest
0 голосов
/ 12 апреля 2011

Мне нужно преобразовать enum в словарь и после этого формата каждое имя (значение) словаря.

public static Dictionary<int, string> EnumToDictionary<TK>(Func<TK, string > func)
      {
        if (typeof(TK).BaseType != typeof(Enum))
              throw new InvalidCastException();


           return Enum.GetValues(
                typeof(TK))
                .Cast<Int32>()
                .ToDictionary(
                        currentItem => currentItem => Enum.GetName(typeof(TK), currentItem))
                 /*. func for each name */;
           }



      public enum Types {

            type1 = 0,
            type2 = 1,
            type3 = 2
         }


       public string FormatName(Types t) {
             switch (t) {
                         case Types.type1:
                                return "mytype1";

                         case Types.type2:
                              return "mytype2";

                         case Types.type3:
                              return "mytype3";

                           default:
                                return string.Empty;
                 }
           }

После этого мне нужно сделать что-то вроде этого:

var resultedAndFormatedDictionary = 
EnumToDictionary<Types>(/*delegate FormatName() for each element of dictionary() */);

Как определить и реализовать делегат (Func<object, string > func), который выполняет какое-то действие для каждого значения словаря?

ОБНОВЛЕНИЕ: Результат перешифровки равен

var a = EnumToDictionary<Types>(FormatName);

   //a[0] == "mytype1"
   //a[1] == "mytype2"
   //a[2] == "mytype3"

1 Ответ

1 голос
/ 12 апреля 2011

Исходя из вашего вопроса, вы хотите добиться создания словаря из перечисления, где значение перечисления в виде int является ключом, а какое-то отформатированное имя для него является значением, верно?

Ну, во-первых, функция, которую вы передаете, должна принять TK в качестве аргумента, не так ли?
Во-вторых, бросать InvalidCastException кажется немного странным. InvalidOperationException может быть более подходящим (см. Также этот вопрос )
Третий ToDictionary уже совсем близко:

public static Dictionary<int, string> EnumToDictionary<TK>(Func<TK, string> func)
{
     if (typeof(TK).BaseType != typeof(Enum))
        throw new InvalidOperationException("Type must be enum");

     return Enum.GetValues(typeof(TK)).Cast<TK>().ToDictionary(x => Convert.ToInt32(x), x => func(x));
}

Теперь вы можете назвать это так:

public enum Types 
{
    type1 = 0,
    type2 = 1,
    type3 = 2
}

public string FormatName(Types t) 
{
    switch (t) 
    {
        case Types.type1:
            return "mytype1";

        case Types.type2:
            return "mytype2";

        case Types.type3:
             return "mytype3";

        default:
            return string.Empty;
     }
}

var resultedAndFormatedDictionary = EnumToDictionary<Types>(FormatName);
...