这个GetEnumAsStrings <t>()方法重新发明轮子吗?</t>

时间:2010-06-10 14:15:55

标签: c# list foreach ienumerable enums

我有一些枚举,需要将它们作为 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(),所以我创建了这个我从this method创建的方法:< / p>

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 个答案:

答案 0 :(得分:8)

你可以使用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;
}

答案 1 :(得分:7)

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>,否则我会直接使用数组。