2009-04-24 20 views
5

tengo la estructura de enumeración de la siguiente manera:obtener una lista de enumeraciones disponibles

public enum MyEnum 
{ 
    One=1, 
    Two=2, 
    Three=3 
} 

Ahora quiero obtener una lista de MyEnum, es decir, List<MyEnum> que contiene toda la One, TwoThree. Again, estoy buscando un trazador de líneas que hace la cosa. Salí con una consulta LINQ pero era insatisfactoria, ya que era un poco demasiado largo, pienso:

Enum.GetNames(typeof(MyEnum)) 
          .Select(exEnum => 
           (MyEnum)Enum.Parse(typeof(MyEnum), exEnum)) 
          .ToList(); 

Una sugerencia mejor?

Respuesta

14
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); 
+3

Por supuesto, ToList() si realmente necesita hacer una lista en particular. – mquander

2
No

un chiste (así la puesta en práctica no lo es, pero el método es: P), pero tal vez añadir algo como this a una clase de herramientas/utilidad que devolverá una lista genérica:

public static List<T> EnumToList<T>() 

{ 

Type enumType = typeof(T); 

// Can't use type constraints on value types, so have to do check like this 

if (enumType.BaseType != typeof(Enum)) 

    throw new ArgumentException("T must be of type System.Enum"); 

return new List<T>(Enum.GetValues(enumType) as IEnumerable<T>); 

} 
+0

Hubiera preferido mi propia solución a la tuya. – Graviton

+0

¿No sería bueno si C# tuviera una restricción genérica "donde T: enum"? –

+0

Eso está bien, pero ¿realmente necesita rechazar mi sugerencia? heh –

3

Estoy de acuerdo con el código de @ mquander.

Sin embargo, le sugiero que también caché la lista, ya que es muy poco probable que cambie en el transcurso de la ejecución de su programa. Ponlo en una variable de solo lectura estática en alguna ubicación global:

public static class MyGlobals 
{ 
    public static readonly List<MyEnum> EnumList = 
     Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList(); 
} 
Cuestiones relacionadas