Rất tiếc, các hoạt động cờ enum tích hợp của .NET rất tiếc. Hầu hết thời gian người dùng còn lại với việc tìm ra logic hoạt động bitwise.
Trong .NET 4, phương thức HasFlag
đã được thêm vào để Enum
giúp đơn giản hóa mã của người dùng nhưng không may có nhiều vấn đề với nó.
HasFlag
không an toàn kiểu vì nó chấp nhận bất kỳ loại đối số giá trị enum nào, không chỉ loại enum đã cho.
HasFlag
không rõ ràng về việc nó kiểm tra xem giá trị có tất cả hoặc bất kỳ cờ nào được cung cấp bởi đối số giá trị enum hay không. Nhân tiện đây là tất cả.
HasFlag
là khá chậm vì nó đòi hỏi quyền anh gây ra sự phân bổ và do đó nhiều bộ sưu tập rác hơn.
Do một phần hỗ trợ hạn chế của .NET cho enum cờ, tôi đã viết thư viện OSS Enums.NET để giải quyết từng vấn đề này và giúp việc xử lý các enum cờ dễ dàng hơn nhiều.
Dưới đây là một số hoạt động mà nó cung cấp cùng với các triển khai tương đương của chúng chỉ sử dụng .NET framework.
Cờ kết hợp
.MẠNG LƯỚI flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
Xóa cờ
.MẠNG LƯỚI flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
Cờ chung
.MẠNG LƯỚI flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
Chuyển đổi cờ
.MẠNG LƯỚI flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
Có tất cả cờ
.NET (flags & otherFlags) == otherFlags
hoặcflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
Có cờ nào không
.MẠNG LƯỚI (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
Nhận cờ
.MẠNG LƯỚI
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
Tôi đang cố gắng để có những cải tiến này được tích hợp vào .NET Core và cuối cùng có thể là .NET Framework đầy đủ. Bạn có thể kiểm tra đề xuất của tôi ở đây .