Trong .NET Core và .NET> 4 có một phương thức phân tích chung :
Enum.TryParse("Active", out StatusEnum myStatus);
Điều này cũng bao gồm out
các biến nội tuyến mới của C # 7 , do đó, điều này thực hiện phân tích thử, chuyển đổi sang loại enum rõ ràng và khởi tạo + điền vàomyStatus
biến.
Nếu bạn có quyền truy cập vào C # 7 và .NET mới nhất thì đây là cách tốt nhất.
Câu trả lời gốc
Trong .NET, nó khá xấu (cho đến 4 hoặc cao hơn):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
Tôi có xu hướng đơn giản hóa điều này với:
public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
Sau đó tôi có thể làm:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
Một tùy chọn được đề xuất trong các nhận xét là thêm tiện ích mở rộng, đủ đơn giản:
public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
Cuối cùng, bạn có thể muốn có một enum mặc định để sử dụng nếu chuỗi không thể được phân tích cú pháp:
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;
}
Điều này làm cho cuộc gọi này:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Tuy nhiên, tôi sẽ cẩn thận thêm một phương thức mở rộng như thế này vào string
(không có kiểm soát không gian tên) nó sẽ xuất hiện trên tất cả các trường hợp string
cho dù chúng có giữ enum hay không (vì vậy 1234.ToString().ToEnum(StatusEnum.None)
sẽ hợp lệ nhưng vô nghĩa). Tốt nhất là tránh làm lộn xộn các lớp lõi của Microsoft bằng các phương thức bổ sung chỉ áp dụng trong các ngữ cảnh rất cụ thể trừ khi toàn bộ nhóm phát triển của bạn hiểu rất rõ về những tiện ích mở rộng đó làm gì.