visual net español enum c# .net vb.net enums

net - enum to string c#



Cómo limitar un parámetro de tipo genérico a System.Enum (4)

Posibles duplicados:
¿Alguien sabe una buena solución para la falta de una restricción genérica enum?
Crear un método genérico que limite T a un Enum

¿Es posible limitar el parámetro de tipo genérico [No sé si ese es el nombre correcto] a un Enum ?

Por ejemplo, ¿cómo hago algo como esto?

//VB.NET Function GetValues(Of T As System.Enum)(ByVal value As T) As IEnumerable(Of T) Return [Enum].GetValues(value.GetType) End Function //C# public IEnumerable<T> GetValues<T>(T value) where T : System.Enum { return Enum.GetValues(value.GetType()); }

Actualizar

Eventualmente usé la Melodía no restringida de Jon Skeet para ese propósito. Gracias a todos por sus contribuciones.



Las respuestas de Matt y Danny tienen la mitad de la respuesta. Esto realmente debería obtener lo que necesita:

public IEnumerable<T> GetValues<T>() where T : struct { if (!typeof(T).IsEnum) throw new InvalidOperationException("Generic type argument is not a System.Enum"); return Enum.GetValues(typeof(T)).OfType<T>(); }

Cambios de la respuesta de Danny:

  • Aunque tener un parámetro del tipo genérico permite la inferencia de tipo, dado que el valor no se usa realmente, es más apropiado especificar explícitamente el tipo genérico (como con los métodos Linq que no toman parámetros).
  • Enum.GetValues ​​() devuelve una matriz de objetos, que no se convertirá implícitamente en un IEnumerable de T. El método Linq adicional para emitir los resultados (técnicamente, OfType es una operación de filtro, pero en este caso devolverá todo) es necesario para conformarse con el tipo de devolución.
  • Opcional: aunque NotSupportedException es una opción tan buena como cualquiera para lanzar una excepción, existen otras opciones; ArgumentException, InvalidOperationException, InvalidCastException, etc. Elegí InvalidOperationException porque eso es lo que es; un intento no válido de obtener valores enum de un tipo que no sea enum. Esto es semántico y no voy a discutir con la lógica de nadie más.

No hay necesidad de hacer que su método sea genérico de esta manera.

Solo puede usar System.Enum como parámetro de tipo en su tipo de devolución:

using System.Linq; . . . public IEnumerable<Enum> GetValues(Enum value) { return Enum.GetValues(value.GetType()).OfType<Enum>(); }


No puedes. Una solución alternativa es usar la comprobación struct y run-time.

public IEnumerable<T> GetValues<T>(T value) where T : struct { if (!typeof(T).IsEnum) throw new NotSupportedException(); return (IEnumerable<T>)Enum.GetValues(value.GetType()); }