En .NET Core y .NET> 4 hay un método de análisis genérico :
Enum.TryParse("Active", out StatusEnum myStatus);
Esto también incluye las nuevas out
variables en línea de C # 7 , por lo que realiza la conversión de prueba, conversión al tipo de enumeración explícita e inicializa + llena la myStatus
variable.
Si tiene acceso a C # 7 y al último .NET, esta es la mejor manera.
Respuesta original
En .NET es bastante feo (hasta 4 o superior):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Tiendo a simplificar esto con:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Entonces puedo hacer:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Una opción sugerida en los comentarios es agregar una extensión, que es lo suficientemente simple:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Finalmente, es posible que desee tener una enumeración predeterminada para usar si la cadena no se puede analizar:
public static T ToEnum<T>(this string value, T defaultValue)
{
if (string.IsNullOrEmpty(value))
{
return defaultValue;
}
T result;
return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}
Lo que hace que esta sea la llamada:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Sin embargo, sería cuidadoso al agregar un método de extensión como este, string
ya que (sin control de espacio de nombres) aparecerá en todas las instancias de string
si tienen una enumeración o no (por 1234.ToString().ToEnum(StatusEnum.None)
lo que sería válido pero sin sentido). A menudo es mejor evitar abarrotar las clases principales de Microsoft con métodos adicionales que solo se aplican en contextos muy específicos, a menos que todo su equipo de desarrollo comprenda muy bien lo que hacen esas extensiones.