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.
Desafortunadamente, no se puede: Microsoft cerró este como un artículo que no reparará .
Puedes tratar las enumeraciones como estructuras y usarlas como la restricción en su lugar (creo que fue así como lo hizo Jon Skeet en Melodía no restringida) pero eso es algo desagradable.
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());
}