Tôi đã viết mã số TryParse
enum theo giá trị hoặc theo tên của nó như được hiển thị bên dưới. Làm thế nào tôi có thể mở rộng mã này để bao gồm phân tích cú pháp enums với thuộc tính Flags
?Enum.TryParse với thuộc tính Flags
public static bool TryParse<T>(this T enum_type, object value, out T result)
where T : struct
{
return enum_type.TryParse<T>(value, true, out result);
}
public static bool TryParse<T>(this T enum_type,
object value, bool ignoreCase, out T result)
where T : struct
{
result = default(T);
var is_converted = false;
var is_valid_value_for_conversion = new Func<T, object, bool, bool>[]{
(e, v, i) => e.GetType().IsEnum,
(e, v, i) => v != null,
(e, v, i) => Enum.GetNames(e.GetType()).Any(n => String.Compare(n, v.ToString(), i) == 0) || Enum.IsDefined(e.GetType(), v)
};
if(is_valid_value_for_conversion.All(rule => rule(enum_type, value, ignoreCase))){
result = (T)Enum.Parse(typeof(T), value.ToString(), ignoreCase);
is_converted = true;
}
return is_converted;
}
Hiện nay mã này làm việc cho enums sau:
enum SomeEnum{ A, B, C }
// can parse either by 'A' or 'a'
enum SomeEnum1 : int { A = 1, B = 2, C = 3 }
// can parse either by 'A' or 'a' or 1 or "1"
Không làm việc cho:
[Flags]
enum SomeEnum2 { A = 1, B = 2, C = 4 } // can parse either by 'A' or 'a'
// cannot parse for A|B
Cảm ơn!
Không nên kiểm tra null là quy tắc đầu tiên của bạn? – ChaosPandion
Kiểm tra đầu tiên hoặc thứ hai sẽ không tạo sự khác biệt trong trường hợp này IMO, trừ khi tôi thiếu thứ gì đó, bên cạnh đó ràng buộc là cấu trúc, tôi nghĩ chúng ta cần kiểm tra xem cuộc gọi có thuộc loại enum hợp lệ hay không trước khi kiểm tra xem giá trị có vô giá trị – Sunny