2010-06-10 1 views
3

J'ai un certain nombre de énumérations et doivent les obtenir comme List<string> objets afin de énumérer par eux et par conséquent fait la méthode GetEnumAsStrings<T>().Est-ce que cette méthode GetEnumAsStrings <T>() réinvente la roue?

Mais il me semble qu'il y aurait un moyen plus facile.

N'y a-t-il pas une méthode intégrée pour obtenir une énumération comme celle-ci dans un 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 
    } 
} 

Addendum:

Merci à tous, très perspicace. Depuis que je finalement besoin de ce pour Silverlight qui ne semble pas avoir GetValues() ou GetNames() pour énumérations, je fis cette méthode que j'ai créé à partir 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; 
} 

Répondre

8

Vous pouvez le faire en utilisant un revêtement LINQ :

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

maintenant, gardez à l'esprit que GetNames retourne un tableau de chaînes ... et vous pourriez même pas besoin ToList().

Editer:
Il existe des moyens d'améliorer votre code édité. Voici un simple qui utilise ToList plutôt que instancier explicitement la liste:

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

Ce prochain est ma préférence personnelle. Pourquoi instancier une liste du tout? Vous probablement juste besoin de parcourir les noms, ne pas ajouter ou les retirer d'une liste. Il suffit donc d'utiliser IEnumerable et ne vous occupez pas de la construction de la liste. Vous économise une (certes petite) itération et la surcharge de mémoire d'un autre objet.

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

Donc, pour votre exemple, il serait:

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

Ou, si vous êtes de retour encore dans .NET 2.0

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

Si vous avez vraiment besoin en tant que List<string>, sinon je voudrais juste travailler directement avec le tableau.

Questions connexes