In .NET Core e .NET> 4 esiste un metodo di analisi generico :
Enum.TryParse("Active", out StatusEnum myStatus);
Ciò include anche le nuove out
variabili inline di C # 7 , quindi esegue la prova-analisi, la conversione nel tipo enum esplicito e inizializza + popola la myStatus
variabile.
Se hai accesso a C # 7 e all'ultimo .NET, questo è il modo migliore.
Risposta originale
In .NET è piuttosto brutto (fino al 4 o superiore):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Tendo a semplificare questo con:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Quindi posso fare:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Un'opzione suggerita nei commenti è l'aggiunta di un'estensione, che è abbastanza semplice:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Infine, potresti voler avere un enum predefinito da usare se la stringa non può essere analizzata:
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;
}
Il che rende questa la chiamata:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Tuttavia, starei attento ad aggiungere un metodo di estensione come questo in string
quanto (senza controllo dello spazio dei nomi) apparirà su tutte le istanze del string
possesso di un enum o meno (quindi 1234.ToString().ToEnum(StatusEnum.None)
sarebbe valido ma senza senso). Spesso è meglio evitare di ingombrare le classi principali di Microsoft con metodi extra che si applicano solo in contesti molto specifici, a meno che l'intero team di sviluppo non abbia un'ottima conoscenza di ciò che fanno quelle estensioni.