Nghĩ rằng điều này có thể hữu ích cho những người khác vấp ngã ở đây như tôi.
Hãy cẩn thận với cách bạn xử lý bất kỳ giá trị enum nào mà bạn có thể đặt thành giá trị == 0 (đôi khi có thể hữu ích khi có trạng thái Không xác định hoặc Không sử dụng cho enum). Nó gây ra vấn đề khi dựa vào các hoạt động thao tác bit này.
Ngoài ra khi bạn có các giá trị enum là sự kết hợp của sức mạnh khác của 2 giá trị, ví dụ:
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
Trong những trường hợp này, một phương thức mở rộng như thế này có thể có ích:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
Và cũng là phương thức Is set tương đương xử lý các giá trị kết hợp (mặc dù theo một cách hơi khó hiểu)
public static bool IsSet(this Colour states, Colour state)
{
// By default if not OR'd
if (states == state)
return true;
// Combined: One or more bits need to be set
if( state == Colour.Orange )
return 0 != (int)(states & state);
// Non-combined: all bits need to be set
return (states & state) == state;
}