Como obter todos os valores de um Enum?
Pergunta
Eu quero criar um método que leva em um tipo Enum
, e volta tudo o que é membros em uma matriz, Como criar tal função?
Tome por exemplo, eu tenho esses dois enums:
public enum Family
{
Brother,
Sister,
Father
}
public enum CarType
{
Volkswagen,
Ferrari,
BMW
}
Como criar uma função GetEnumList
para que ele retorne
-
{Family.Brother, Family.Sister, Family.Father}
para o primeiro caso. -
{CarType.Volkswagen, CarType.Ferrari, CarType.BMW}
para o segundo caso.
Eu tentei:
private static List<T> GetEnumList<T>()
{
var enumList = Enum.GetValues(typeof(T))
.Cast<T>().ToList();
return enumList;
}
Mas eu tenho um InvalidOperationException
:
System.InvalidOperationException: operações ligadas tardias não podem ser executadas em tipos ou métodos para os quais ContainsGenericParameters é verdade. em System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException () em System.Reflection.RuntimeMethodInfo.Invoke (Object obj, invokeAttr BindingFlags, Binder ligante objecto [] parâmetros, cultura CultureInfo, booleano skipVisibilityChecks) em System.Reflection.RuntimeMethodInfo.Invoke (Object obj, invokeAttr BindingFlags, Binder ligante objecto [] parâmetros, cultura CultureInfo) em System.Reflection.MethodBase.Invoke (obj Object, Object [] parâmetros)
Editar: O código acima está trabalhando excelentes-- a razão que eu tenho uma exceção foi porque profiler me causou o erro. Obrigado a todos por suas soluções.
Solução
Aqui está o 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;
}
Outras dicas
(Family[])Enum.GetValues(typeof(Family))
Assim?
private static List<string> GetEnumList<T>()
{
return Enum.GetNames( typeof( T ) )
.Select(s => typeof(T).Name + "." + s).ToList();
}