如何从[Flag]枚举属性中检索值?

这个问题在这里已经有了答案:

  • 在C#中,[Flags]枚举属性意味着什么? 10个答案

  • 首先,标志必须有一个None = 0值,否则无法表示0掩码(即没有值)。

    一旦你固定它,你可以检查一些枚举值是在使用一些定标志Enum.HasFlag或逐位&操作:

    Level.HasFlag(LogLevel.Pages);
    

    ...要么:

    (Level & LogLevel.Pages) == LogLevel.Pages
    

    最后,当你实现一个标志枚举时,通常枚举标识符用复数表示。 在你的情况,你应该重构LogLevelLogLevels

    为什么&

    每个枚举值代表完整掩码中的一个位。 例如, 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 
    
  • 1和1(true和true == true)
  • 1和0(true和false == false)
  • 0和0(false和false == false)。
  • 整个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

    上一篇: How do I retrieve a value from a [Flag] enum property?

    下一篇: Logical operators on enums