如何从[Flag]枚举属性中检索值?
这个问题在这里已经有了答案:
首先,标志必须有一个None = 0
值,否则无法表示0
掩码(即没有值)。
一旦你固定它,你可以检查一些枚举值是在使用一些定标志Enum.HasFlag
或逐位&
操作:
Level.HasFlag(LogLevel.Pages);
...要么:
(Level & LogLevel.Pages) == LogLevel.Pages
最后,当你实现一个标志枚举时,通常枚举标识符用复数表示。 在你的情况,你应该重构LogLevel
到LogLevels
。
为什么&
?
每个枚举值代表完整掩码中的一个位。 例如, None
将为0,但也可以表示为0, 0, 0
其中每个0
都是LogLevels
中可能的枚举值之一。 当你提供像LogLevels.Pages | LogLevels.Methods
这样的掩码时 LogLevels.Pages | LogLevels.Methods
,那么该掩模是1, 1, 0
。
为了检查Pages
是否在掩码内,可以使用逻辑AND将掩码与可能的枚举值之一进行比较:
1, 1, 0 (LogLevels.Pages | LogLevels.Methods)
1, 0, 0 AND (LogLevels.Pages)
--------
1, 0, 0
整个AND就像隔离测试的枚举值。 如果生成的掩码等于枚举值,则掩码包含枚举值。
一些OP关注
OP在一些评论中表示:
只是一个关于零价值的快速问题。 这里指出你不能在按位AND操作中使用None枚举常量来测试一个标志,因为结果总是为零。 这是否意味着如果我有一个0值,我不能使用&并且必须使用HasFlag?
None
(即0
)不会是掩码的成员,因为0不存在。 当你生成一个你使用OR |
的掩码时 逻辑运算符,即在一天结束时添加。
考虑1 + 0 == 1
。 你认为检查0
是否在1
以内是可能的吗?
实际上, None = 0
值需要能够表示和清空掩码。
最后, HasFlag
为你做AND
,这不是一个神奇的解决方案,而是一种更可读和封装的方式来执行所谓的AND
。
喜欢这个
if (Level.HasFlag(LogLevel.Pages))
{
//todo
}
链接地址: http://www.djcxy.com/p/54431.html