c# - 枚举标志属性

标签 c# enums bit-manipulation

我正在尝试使用应用的 FlagsAttribute 评估枚举,如下所示。问题在于为确保正确的 if 语句运行而采用的代码数量多得离谱。我有四个 if 语句,它们应该只在设置了枚举的特定组合但没有别的时执行:

  1. 私有(private)的,静态的
  2. 私有(private)
  3. 特权
  4. 公开

检测所需标志的存在很容易,但我还必须确保没有其他标志被设置,这是一个荒谬的代码输入量,看起来像是一场维护噩梦。

[Flags]
public enum AccessModifierType : short
{
    Infer = 1,
    Public = 2,
    Privileged = 4,
    Private = 8,
    Static = 16
}

任何人都可以重写这个 if 语句以使其更简洁吗?

if ((Model.CurrentContext.CurrentAccessModifierType & AccessModifierType.Public) == AccessModifierType.Public
        && (Model.CurrentContext.CurrentAccessModifierType & AccessModifierType.Static) != AccessModifierType.Static
        && (Model.CurrentContext.CurrentAccessModifierType & AccessModifierType.Privileged) != AccessModifierType.Privileged
        && (Model.CurrentContext.CurrentAccessModifierType & AccessModifierType.Private) != AccessModifierType.Private){
}

最佳答案

目前尚不清楚您的最终样本与您的原始要求有何关系(我觉得 Infer 有一些特殊的含义?)但是如果您正在寻找一个特定的 位组合,仅此而已,为什么不对确切的预期枚举值(通过按位 OR 组装)使用相等性测试?

if(myUnknownFlagsEnumValue == (MyEnum.RequiredFlag1 | MyEnum.RequiredFlag2))
{
    ...
}

关于c# - 枚举标志属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10395218/

相关文章:

C# process.start,如何知道进程是否结束?

c# - 从枚举中获取异常

c++ - 收到 "enum is not a class or namespace"错误 - C++

c - 按位补码

javascript - Javascript中位运算的效率

c# - Crystal Reports 和 Report Viewer 运行时问题

c# - 在 Repeater 中传递行的 ID 以提交 ASP NET 中的按钮

c# - 不安全边缘检测仍然很慢

java - 为什么我的枚举类型无法初始化?

objective-c - 字段打包字节返回意外结果