2010-06-10 41 views
3

我有一些枚举,需要让他们为List<string>对象以列举通过他们,并因此取得了GetEnumAsStrings<T>()方法。这是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创建:

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; 
} 

回答

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; 
} 
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>,否则我会直接与数组一起工作。

相关问题