Di .NET Core dan .NET> 4 ada metode parse generik :
Enum.TryParse("Active", out StatusEnum myStatus);
Ini juga termasuk out
variabel inline baru C # 7 , jadi ini melakukan try-parse, konversi ke tipe enum eksplisit dan menginisialisasi + mengisi myStatus
variabel.
Jika Anda memiliki akses ke C # 7 dan .NET terbaru, ini adalah cara terbaik.
Jawaban Asli
Di .NET agak jelek (sampai 4 atau lebih):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Saya cenderung menyederhanakan ini dengan:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Maka saya bisa melakukan:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Salah satu opsi yang disarankan dalam komentar adalah menambahkan ekstensi, yang cukup sederhana:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Terakhir, Anda mungkin ingin memiliki enum default untuk digunakan jika string tidak dapat diuraikan:
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;
}
Yang membuat ini panggilan:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Namun, saya akan berhati-hati menambahkan metode ekstensi seperti ini string
sebagai (tanpa kontrol namespace) itu akan muncul di semua contoh string
apakah mereka memegang enum atau tidak (jadi 1234.ToString().ToEnum(StatusEnum.None)
akan valid tetapi tidak masuk akal). Sering kali yang terbaik adalah menghindari kekacauan kelas inti Microsoft dengan metode tambahan yang hanya berlaku dalam konteks yang sangat spesifik kecuali jika seluruh tim pengembangan Anda memiliki pemahaman yang sangat baik tentang apa yang dilakukan ekstensi tersebut.