No .NET Core e .NET> 4, existe um método de análise genérico :
Enum.TryParse("Active", out StatusEnum myStatus);
Isso também inclui as novas out
variáveis embutidas do C # 7 , o que faz a tentativa de análise, a conversão para o tipo de enum explícito e inicializa + preenche a myStatus
variável.
Se você tiver acesso ao C # 7 e ao .NET mais recente, é a melhor maneira.
Resposta original
No .NET, é bastante feio (até 4 ou mais):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Costumo simplificar isso com:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Então eu posso fazer:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Uma opção sugerida nos comentários é adicionar uma extensão, que é bastante simples:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Por fim, convém usar uma enumeração padrão se a sequência não puder ser analisada:
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;
}
O que faz desta a chamada:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
No entanto, eu seria cuidadoso ao adicionar um método de extensão como este para string
que (sem controle de namespace) apareça em todas as instâncias, string
se eles possuem um enum ou não (isso 1234.ToString().ToEnum(StatusEnum.None)
seria válido, mas sem sentido). Geralmente, é melhor evitar bagunçar as classes principais da Microsoft com métodos extras que só se aplicam em contextos muito específicos, a menos que toda a equipe de desenvolvimento tenha um entendimento muito bom do que essas extensões fazem.