这个GetEnumAsStrings <T>()方法是否重新发明轮子?

Edw*_*uay 3 c# ienumerable foreach enums list

我有许多枚举,需要将它们作为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
    }
}
Run Code Online (Sandbox Code Playgroud)

附录:

谢谢大家,非常有见地.因为我最终需要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;
}
Run Code Online (Sandbox Code Playgroud)

Ran*_*pho 8

您可以使用LINQ将其作为单行使用:

var enums = Enum.GetNames(typeof(TestModes)).ToList();
Run Code Online (Sandbox Code Playgroud)

现在,请记住,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();    
}
Run Code Online (Sandbox Code Playgroud)

而下一个是我个人的偏好.为什么要实例化一个列表呢?您可能只需要遍历名称,而不是从列表中添加或删除它们.所以只需使用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;
}
Run Code Online (Sandbox Code Playgroud)


Jus*_*ner 7

MSDN - Enum.GetNames

所以对于你的例子,它将是:

List<string> testModes = Enum.GetNames(typeof(TestModes)).ToList();
Run Code Online (Sandbox Code Playgroud)

或者,如果你还在.NET 2.0中

List<string> testModes = new List<string>(Enum.GetNames(typeof(TestModes)));
Run Code Online (Sandbox Code Playgroud)

如果你真的需要它作为一个List<string>,否则我会直接使用数组.