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 outvariables 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 myStatusvariable.
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, stringya que (sin control de espacio de nombres) aparecerá en todas las instancias de stringsi 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.