. net的内置标志枚举操作非常有限。大多数情况下,用户需要弄清楚按位操作的逻辑。
在。net 4中,HasFlag方法被添加到Enum中,这有助于简化用户的代码,但不幸的是,它存在许多问题。
HasFlag不是类型安全的,因为它接受任何类型的枚举值参数,而不仅仅是给定的枚举类型。
HasFlag对于是否检查值是否具有enum value参数提供的所有或任何标志具有歧义性。顺便说一下。
HasFlag相当慢,因为它需要装箱,这会导致分配和更多的垃圾收集。
由于. net对标志枚举的支持有限,我编写了OSS库enums。NET解决了这些问题,使处理标志枚举更加容易。
下面是它提供的一些操作以及仅使用. net框架的等效实现。
把国旗
.NET标志| otherFlags
Enums.NET 标志。CombineFlags(otherFlags)
删除标志
.NET标志& ~otherFlags
Enums.NET 标志。删除标志(其他标志)
常见的旗帜
.NET标志和其他标志
Enums.NET 标志。CommonFlags(otherFlags)
切换的旗帜
.NET flags ^ otherFlags
Enums.NET 标志。切换标志(其他标志)
拥有所有旗帜
.NET (flags & otherFlags) == otherFlags或flags. hasflag (otherFlags)
Enums.NET 标志。HasAllFlags(otherFlags)
是否有旗帜
.NET (flags & otherFlags) != 0
Enums.NET 标志。HasAnyFlags(otherFlags)
让国旗
.NET
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 标志。GetFlags()
我正试图将这些改进整合到。net Core中,并最终整合到完整的。net框架中。你可以在这里查看我的提案。