.NET Core ve .NET> 4'te genel bir ayrıştırma yöntemi vardır :
Enum.TryParse("Active", out StatusEnum myStatus);
Bu, C # 7'nin yeni satır içi out
değişkenlerini de içerir , bu nedenle bu, ayrıştırma, açık numara türüne dönüştürme ve myStatus
değişkeni başlatır + doldurur .
C # 7'ye ve en son .NET'e erişiminiz varsa, bu en iyi yoldur.
Orijinal Yanıt
.NET'te oldukça çirkin (4 veya daha yukarı):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Ben ile basitleştirmek eğilimindedir:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Sonra yapabilirim:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Yorumlarda önerilen seçeneklerden biri, yeterince basit bir uzantı eklemektir:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Son olarak, dize ayrıştırılamazsa kullanılacak varsayılan bir numaralandırma kullanmak isteyebilirsiniz:
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;
}
Bu çağrı yapar:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Ancak, böyle bir uzatma yöntemi string
(ad alanı kontrolü olmadan) string
bir enum tutup tutmayacakları gibi görünür (bu yüzden 1234.ToString().ToEnum(StatusEnum.None)
geçerli ama saçma olurdu ) olarak eklemek dikkatli olacaktır . Microsoft'un çekirdek sınıflarını, tüm geliştirme ekibiniz bu uzantıların ne yaptığına dair çok iyi bir anlayışa sahip olmadıkça, yalnızca belirli bağlamlarda geçerli olan ek yöntemlerle karıştırmaktan kaçınmak en iyisidir.