index example enumerador enum crear como clase acceder c# enums

example - enum index c#



Enum.GetValues() Tipo de devolución (6)

He leído documentación que establece que ''dado el tipo de la enumeración, el método GetValues ​​() de System.Enum devolverá una matriz del tipo de base de la enumeración dada'', es decir, int, byte, etc.

Sin embargo, he estado usando el método GetValues ​​y todo lo que sigo recibiendo es una matriz de tipos de entradas. ¿¿Me estoy perdiendo de algo??

public enum Response { Yes = 1, No = 2, Maybe = 3 }

foreach (var value in Enum.GetValues(typeof(Response))) { var type = value.GetType(); // type is always of type Enum not of the enum base type }

Gracias


¿Puedes referirte a la documentación que mencionas? La documentación de MSDN en Enum.GetValues no menciona nada de eso (cita de esa página):

Valor de retorno

Tipo: System.Array

Una matriz de los valores de las constantes en enumType. Los elementos de la matriz se ordenan por los valores binarios de las constantes de enumeración.


Como Roger mencionó en un comentario, sería bueno si hubiera una implementación genérica Enum.GetValues<MyEnum>() , pero no la hay.

Este problema también me molestaba muchísimo, así que creé una biblioteca en C ++ / CLI que tiene implementaciones genéricas de todos los métodos estáticos en la clase Enum (así como muchos otros métodos genéricos para trabajar con enumeraciones) .

La biblioteca está escrita en C ++ / CLI porque C # no admite la restricción de un tipo genérico por System.Enum. C ++ / CLI (y el CLR) son compatibles con la restricción de System.Enum y C # / VB.NET no tiene problemas para entender las llamadas a un método que tiene esta restricción.

En el caso de su ejemplo, usaría Enums.GetValues<MyEnumType>() que le proporcionará una matriz de MyEnumType sin la necesidad de MyEnumType . Aunque C # y VB.Net no admiten la definición de una restricción enum, no tienen ningún problema con consumir un método / clase que tenga tal restricción e intellisense / el compilador lo maneje perfectamente.


Debes lanzar el resultado al tipo de matriz real que quieras

(Response[])Enum.GetValues(typeof(Response))

como GetValues ​​no está fuertemente tipado

EDITAR: solo vuelve a leer la respuesta. Necesita convertir explícitamente cada valor enum al tipo subyacente, ya que GetValues ​​devuelve una matriz del tipo de enumeración real en lugar del tipo base. Enum.GetUnderlyingType podría ayudar con esto.


Personalmente, he creado un método diferente en mi proyecto Utils, que incluyo en mis otros proyectos. Aquí está el código que uso:

public static class EnumUtil { public static IEnumerable<TEnum> GetAllValues<TEnum>() where TEnum : struct, IConvertible, IComparable, IFormattable { return Enum.GetValues(typeof(TEnum)).Cast<TEnum>(); } }

Y lo llamo así:

var enumValues = EnumUtil.GetAllValues<Response>();


Si está utilizando NET 3.5 (es decir, tiene LINQ), puede hacer lo siguiente:

var responses = Enum.GetValues(typeof(Response)).Cast<Response>();


Similar a la respuesta de Joel pero hecha de una manera ligeramente diferente:

public static class Enums<T> where T : struct, IComparable, IFormattable, IConvertible { static Enums() { if (!typeof(T).IsEnum) throw new ArgumentException("Type T must be an Enum type"); } public static IEnumerable<T> GetValues() { var result = ((T[])Enum.GetValues(typeof(T)).ToList() return result; } }

Uso:

IEnumerable<System.Drawing.FontStyle> styles = Enums<System.Drawing.FontStyle>.GetValues();