2010-06-10 58 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>,否則我會直接與數組一起工作。

相關問題