Есть ли способ перебирать и отражать имена членов и значения, содержащиеся в перечислениях? - PullRequest
7 голосов
/ 05 февраля 2010

Допустим, у меня есть следующее enum:

public enum Colors
{
    White = 10,
    Black = 20,
    Red = 30,
    Blue = 40
}

Мне интересно, есть ли способ перебрать все элементы Colors, чтобы найти имена членов и их значения.

Ответы [ 2 ]

12 голосов
/ 05 февраля 2010

Вы можете использовать Enum.GetNames и Enum.GetValues ​​:

var names = Enum.GetNames(typeof(Colors));
var values = Enum.GetValues(typeof(Colors));

for (int i=0;i<names.Length;++i)
{
    Console.WriteLine("{0} : {1}", names[i], (int)values.GetValue(i));
}

Примечание. Когда я пытался запустить код с помощью values[i], он выдал исключение, поскольку values имеет тип Array.

1 голос
/ 05 февраля 2010

Вы могли бы сделать что-то вроде этого

  for (int i = 0; i < typeof(DepartmentEnum).GetFields().Length - 1; i++)
            {
                DepartmentEnum de = EnumExtensions.NumberToEnum<DepartmentEnum>(i);
                pairs.Add(new KeyValuePair<string, string>(de.ToDescription(), de.ToString()));
            }

Вот само расширение:

  public static class EnumExtensions
    {
        public static string ToDescription(this Enum en) 
        {
            Type type = en.GetType();

            MemberInfo[] memInfo = type.GetMember(en.ToString());

            if (memInfo != null && memInfo.Length > 0)
            {
                object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute),false);

                if (attrs != null && attrs.Length > 0)

                    return ((DescriptionAttribute)attrs[0]).Description;
            }

            return en.ToString();
        }

        public static TEnum NumberToEnum<TEnum>(int number )
        {
            return (TEnum)Enum.ToObject(typeof(TEnum), number);
        }
    }
...