Можно ли получить имена и значения членов перечисления в D? - PullRequest
9 голосов
/ 23 июля 2011

Я хотел бы получить имена и значения типа enum в D2. Я знаю, что могу получить значения enum, используя std.traits, но как насчет имен?

Дано:

enum lst
{
  apple,
  bottle,
  orange,
  blue    
}

Я хотел бы получить ассоциативный массив, например.

string lstmap[int] = [1:"apple", 2:"bottle", 3:"orange", 4:"blue"].

Ответ - да. Решение, как мне показывали, таково:

foreach (i, member; __traits(allMembers, lst)) {
  lstmap[cast(int) __traits(getMember, lst, member)] = member;
}

Ответы [ 3 ]

13 голосов
/ 23 июля 2011
foreach (i, member; __traits(allMembers, lst)) {
  lstmap[cast(int) __traits(getMember, lst, member)] = member;
}

(скопировано с вопроса как вики сообщества)

2 голосов
/ 05 апреля 2012

В случае, если вы хотите это исключительно для целей преобразования значения в строку, рассмотрите возможность использования std.conv.to!string(lst.orange) - оценивается как "orange".

0 голосов
/ 31 декабря 2012
      //ENUMList is the name of Enum

        var values = (ENUMList[])Enum.GetValues(typeof(ENUMList));
        var query = from name in values
                    select new EnumData//EnumData is a Modal or Entity
                    {
                        ID = (short)name,
                        Name = GetEnumDescription(name)//Description of Particular Enum Name
                    };
        return query.ToList();
...