Creación de un método genérico con restricción T a Enum en C#
Problema y su solución
Te has encontrado con una limitación conocida en versiones anteriores de C#. A partir de C# 7.3, se introdujo la posibilidad de usar System.Enum como restricción en tipos genéricos. Si estás usando una versión más reciente (C# 7.3 o superior), puedes escribir directamente where T : Enum. Si usas una versión anterior, la solución común es usar where T : struct y luego verificar en tiempo de ejecución si el tipo es un enum, lanzando una excepción si no lo es. Aquí tienes un ejemplo:
public static T ParseEnum(string value) where T : struct
{
if (!typeof(T).IsEnum)
throw new InvalidOperationException("T must be an enum type");
return (T)Enum.Parse(typeof(T), value);
}
Esto evita la duplicación de código y mantiene la seguridad de tipos en tiempo de compilación para structs, con una verificación adicional en tiempo de ejecución. Si puedes usar C# 7.3+, la versión con where T : Enum es más limpia y segura.