ใน. NET Core และ. NET> 4 มีวิธีการแยกวิเคราะห์ทั่วไป :
Enum.TryParse("Active", out StatusEnum myStatus);
นอกจากนี้ยังรวมถึงout
ตัวแปรอินไลน์ใหม่ของ C # 7 ด้วยเหตุนี้จึงลองแยกวิเคราะห์การแปลงเป็นประเภท enum อย่างชัดเจนและกำหนดค่าเริ่มต้น + เติมmyStatus
ตัวแปร
หากคุณสามารถเข้าถึง C # 7 และ. NET ล่าสุดนี่เป็นวิธีที่ดีที่สุด
คำตอบเดิม
ใน. NET มันค่อนข้างน่าเกลียด (จนถึง 4 หรือสูงกว่า):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
ฉันมักจะทำให้สิ่งนี้ง่ายขึ้นด้วย:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
จากนั้นฉันสามารถทำได้:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
ทางเลือกหนึ่งที่แนะนำในความคิดเห็นคือการเพิ่มส่วนขยายซึ่งง่ายพอ:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
ในที่สุดคุณอาจต้องการให้ enum เริ่มต้นใช้หากสตริงไม่สามารถแยกวิเคราะห์:
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;
}
ซึ่งทำให้การโทรนี้:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
อย่างไรก็ตามฉันจะระมัดระวังในการเพิ่มวิธีการขยายเช่นนี้เพื่อstring
เป็น (โดยไม่มีการควบคุมเนมสเปซ) มันจะปรากฏในทุกกรณีstring
ไม่ว่าพวกเขาจะถือ enum หรือไม่ (ดังนั้น1234.ToString().ToEnum(StatusEnum.None)
จะถูกต้อง แต่ไร้สาระ) มักจะเป็นการดีที่สุดที่จะหลีกเลี่ยงความยุ่งเหยิงในชั้นเรียนหลักของ Microsoft ด้วยวิธีการพิเศษที่ใช้เฉพาะในบริบทที่เฉพาะเจาะจงเท่านั้นเว้นแต่ทีมพัฒนาทั้งหมดของคุณจะมีความเข้าใจที่ดีเกี่ยวกับส่วนขยายเหล่านั้น