¿Cómo obtener todos los valores de un Enum?
Pregunta
Quiero crear un método que tome un tipo de Enum
y devuelva todos sus miembros en una matriz. ¿Cómo crear una función de este tipo?
Tomemos, por ejemplo, tengo estas dos enumeraciones:
public enum Family
{
Brother,
Sister,
Father
}
public enum CarType
{
Volkswagen,
Ferrari,
BMW
}
Cómo crear una función GetEnumList
para que se devuelva
-
{Family.Brother, Family.Sister, Family.Father}
para el primer caso. -
{CarType.Volkswagen, CarType.Ferrari, CarType.BMW}
para el segundo caso.
Lo intenté:
private static List<T> GetEnumList<T>()
{
var enumList = Enum.GetValues(typeof(T))
.Cast<T>().ToList();
return enumList;
}
Pero obtuve una InvalidOperationException
:
System.InvalidOperationException: Las operaciones de enlace tardías no se pueden realizar en tipos o métodos para los que ContainsGenericParameters es verdadero. en System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException () en System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parámetros, CultureInfo culture, Boolean skipVisibilityChecks) en System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parameters, cultura CultureInfo) en System.Reflection.MethodBase.Invoke (Objeto obj, Objeto [] parámetros)
Editar: El código anterior funciona bien: la razón por la que obtuve una excepción fue porque el generador de perfiles me causó el error. Gracias a todos por sus soluciones.
Solución
Aquí está el código completo:
public enum Family
{
Brother,
Sister,
Father
}
public enum CarType
{
Volkswagen,
Ferrari,
BMW
}
static void Main(string[] args)
{
Console.WriteLine(GetEnumList<Family>());
Console.WriteLine(GetEnumList<Family>().First());
Console.ReadKey();
}
private static List<T> GetEnumList<T>()
{
T[] array = (T[])Enum.GetValues(typeof(T));
List<T> list = new List<T>(array);
return list;
}
Otros consejos
(Family[])Enum.GetValues(typeof(Family))
¿Te gusta esto?
private static List<string> GetEnumList<T>()
{
return Enum.GetNames( typeof( T ) )
.Select(s => typeof(T).Name + "." + s).ToList();
}