Это метод GetEnumAsStrings <T>(), заново изобретающий колесо? - PullRequest
3 голосов
/ 10 июня 2010

У меня есть число перечислений , и мне нужно получить их как List<string> объектов, чтобы перечислить через них и, следовательно, сделать GetEnumAsStrings<T>() способ.

Но мне кажется, что был бы более легкий путь.

Разве нет встроенного метода для перевода такого перечисления в List<string>?

using System;
using System.Collections.Generic;

namespace TestEnumForeach2312
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> testModes = StringHelpers.GetEnumAsStrings<TestModes>();
            testModes.ForEach(s => Console.WriteLine(s));

            Console.ReadLine();
        }
    }

    public static class StringHelpers
    {
        public static List<string> GetEnumAsStrings<T>()
        {
            List<string> enumNames = new List<string>();
            foreach (T item in Enum.GetValues(typeof(TestModes)))
            {
                enumNames.Add(item.ToString());
            }
            return enumNames;
        }
    }

    public enum TestModes
    {
        Test,
        Show,
        Wait,
        Stop
    }
}

Добавление:

Спасибо всем, очень проницательно. Так как в конечном итоге мне это понадобилось для Silverlight , который, кажется, не имеет GetValues() или GetNames() для перечислений, я сделал этот метод, который я создал из этого метода :

public static List<string> ConvertEnumToListOfStrings<T>()
{
    Type enumType = typeof(T);
    List<string> strings = new List<string>();
    var fields = from field in enumType.GetFields()
                 where field.IsLiteral
                 select field;
    foreach (FieldInfo field in fields)
    {
        object value = field.GetValue(enumType);
        strings.Add(((T)value).ToString());
    }
    return strings;
}

Ответы [ 2 ]

8 голосов
/ 10 июня 2010

Вы можете сделать это как однострочник, используя LINQ:

var enums = Enum.GetNames(typeof(TestModes)).ToList();

Теперь имейте в виду, что GetNames возвращает массив строк ... так что вы можетедаже не нужно ToList().

Редактировать:
Есть способы улучшить отредактированный код.Вот простой пример, который использует ToList, а не явно создает экземпляр списка:

public static List<string> ConvertEnumToListOfStrings<T>()
{
    Type enumType = typeof(T);
    var fields = from field in enumType.GetFields()
                 where field.IsLiteral
                 select ((T)field.GetValue(enumType)).ToString();
    return fields.ToList();    
}

И этот следующий - мое личное предпочтение.Зачем вообще создавать список?Вам , вероятно, просто нужно перебирать имена, а не добавлять или удалять их из списка.Так что просто используйте IEnumerable и не беспокойтесь о создании списка вообще.Экономит вам одну (по общему признанию небольшую) итерацию и накладные расходы на память другого объекта.

public static IEnumerable<string> GetEnumNames<T>()
{
    Type enumType = typeof(T);
    var fields = from field in enumType.GetFields()
                 where field.IsLiteral
                 select ((T)field.GetValue(enumType)).ToString();
    return fields;
}
7 голосов
/ 10 июня 2010

MSDN - Enum.GetNames

Так что для вашего примера это будет:

List<string> testModes = Enum.GetNames(typeof(TestModes)).ToList();

Или, если вы все еще находитесь в .NET 2.0

List<string> testModes = new List<string>(Enum.GetNames(typeof(TestModes)));

Если вам действительно нужно это как List<string>, в противном случае я бы просто работал напрямую с массивом.

...