W .NET Core i .NET> 4 istnieje ogólna metoda analizy :
Enum.TryParse("Active", out StatusEnum myStatus);
Obejmuje to również nowe out
zmienne wbudowane w C # 7 , więc wykonuje to parsowanie, konwersję do jawnego typu wyliczenia i inicjuje + zapełnia myStatus
zmienną.
Jeśli masz dostęp do C # 7 i najnowszej platformy .NET, jest to najlepszy sposób.
Oryginalna odpowiedź
W .NET jest raczej brzydki (do 4 lub więcej):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Zwykle upraszczam to poprzez:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Następnie mogę zrobić:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Jedną z opcji sugerowanych w komentarzach jest dodanie rozszerzenia, które jest dość proste:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Na koniec możesz chcieć mieć domyślny wyliczenie do użycia, jeśli ciąg nie może zostać przeanalizowany:
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;
}
Co sprawia, że jest to połączenie:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Byłbym jednak ostrożny, dodając taką metodę rozszerzenia, string
ponieważ (bez kontroli przestrzeni nazw) pojawi się ona we wszystkich przypadkach, string
czy zawierają wyliczenie, czy nie ( 1234.ToString().ToEnum(StatusEnum.None)
byłoby to prawidłowe, ale bezsensowne). Często najlepiej jest unikać zaśmiecania podstawowych klas Microsoft za pomocą dodatkowych metod, które mają zastosowanie tylko w bardzo specyficznych kontekstach, chyba że cały zespół programistów bardzo dobrze rozumie, co robią te rozszerzenia.