How do I retrieve a value from a [Flag] enum property?
假设我有一个
1 2 3 4 5 6 7 8 | [Flags] public enum LogLevel { None = 1, Pages = 2, Methods = 4, Exception =8 } |
以及一个类,比如:
1 2 3 4 5 6 7 8 9 10 11 | public static class Log { public static LogLevel Level = LogLevel.Methods | LogLevel.Pages; public static void EnterPage([CallerFilePath]string filePath ="") { if (Level == //What value here to check if Level includes Pages?) { //Log } } |
为了检查枚举是否包括
首先,标志必须有一个
修复后,可以使用
1 | Level.HasFlag(LogLevel.Pages); |
…或:
1 | (Level & LogLevel.Pages) == LogLevel.Pages |
最后,在实现标志枚举时,通常枚举标识符以复数形式表示。在您的情况下,您应该将
每个枚举值表示完整掩码中的一位。例如,
为了检查
1 2 3 4 | 1, 1, 0 (LogLevels.Pages | LogLevels.Methods) 1, 0, 0 AND (LogLevels.Pages) -------- 1, 0, 0 |
- 1和1(真和真=真)
- 1和0(真和假=假)
- 0和0(假和假=假)。
整个,就像隔离测试的枚举值。如果生成的掩码等于枚举值,则该掩码包含枚举值。
一些关注点OP在评论中说:
Just a quick question on zero value. here it states that You cannot
use the None enumerated constant in a bitwise AND operation to test
for a flag because the result is always zero. Does that mean if I have
a 0 value I cannot use & and must use HasFlag?
因为0不存在,所以
想想
实际上,需要
最后,
这样地
1 2 3 4 | if (Level.HasFlag(LogLevel.Pages)) { //todo } |