【问题标题】:Testing a [Flags] enum value for a single value测试单个值的 [Flags] 枚举值
【发布时间】:2009-11-02 16:00:18
【问题描述】:

如果我有一个标有[Flags]enum,.NET 中是否有办法测试这种类型的值以查看它是否只包含一个值?我可以使用位计数获得我想要的结果,但如果可能的话,我宁愿使用内置函数。

当动态循环enum 值时,Enum.GetValues() 也会返回组合标志。在以下示例中对 enum 调用该函数会返回 4 个值。但是,我不希望将值 combinations 包含在内部算法中。测试单个 enum 值的相等性已经结束,因为 enum 可能包含许多值,并且当 enum 中的值发生变化时,它还需要额外的维护。

[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Four = 4,
    Seven = One | Two | Four,
}

void MyFunction()
{
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
    {
        if (!_HasSingleValue(enumValue)) continue;

        // Guaranteed that enumValue is either One, Two, or Four
    }
}

private bool _HasSingleValue(MyEnum value)
{
    // ???
}



相关:StackOverflow: Enum.IsDefined on combined flags

【问题讨论】:

    标签: c# .net enums flags


    【解决方案1】:

    您可以将其转换为 int 并使用 Bit Twiddling Hacks 中的技术来检查它是否是 2 的幂。

    int v = (int)enumValue;
    return v != 0 && (v & (v - 1)) == 0;
    

    【讨论】:

    • +1。虽然绝对不是最透明的技术,但它无疑是最简单的。
    【解决方案2】:

    您可以结合使用 IsDefined 和检查 2 的幂。

    【讨论】:

    • 在我写的例子中,IsDefined 的结果总是true
    【解决方案3】:

    你可以 Enum.GetValues 并只计算那些是 2 的幂的项目(可以被 2 整除,没有余数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多