3

我正在尝试评估应用了 FlagsAttribute 的枚举,如下所示。问题是它为确保正确的if语句运行而花费了大量的代码。我有四个if语句,只有在设置了枚举的特定组合时才应该执行,但没有别的

  1. 私有的,静态的
  2. 私人的
  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){
}
4

4 回答 4

2

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

if(myUnknownFlagsEnumValue == (MyEnum.RequiredFlag1 | MyEnum.RequiredFlag2))
{
    ...
}
于 2012-05-01T08:25:51.913 回答
1

首先,与 0 相比更容易,就像提升您重复使用的值一样:

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

如果您想测试并且没有其他标志,那么只需:

if (Model.CurrentContext.CurrentAccessModifierType == AccessModifierType.Public)
{
    ...
}

如果您希望它是公开的,而不是其他三个中的任何一个?那么大概:

if(Model.CurrentContext.CurrentAccessModifierType & (
     AccessModifierType.Public | AccessModifierType.Static |
     AccessModifierType.Priveleged | AccessModifierType.Private
    ) ==  AccessModifierType.Public)
{
   ...
}

这样做的好处是只有一个测试(我也希望编译器|在构建期间执行,所以这只是“ ldc, and, brtrue”或“ ldc, and, brfalse

于 2012-05-01T08:23:45.123 回答
0

如果你使用一些扩展方法——这里的例子那么你应该能够简化你的代码。

AccessModifierType modifier = Model.CurrentContext.CurrentAccessModifierType;
if (modifier.Has(AccessModifierType.Public) && 
    modifier.Has(AccessModifierType.Static) &&
    modifier.Has(AccessModifierType.Privileged) && 
    modifier.Has(AccessModifierType.Private))
{
}
于 2012-05-01T08:42:28.390 回答
0

当然要测试是否只设置了一个标志,您只需针对该标志进行测试:

if( Model.CurrentContext.CurrentAccessModifierType == AccessModifierType.Private)
...

要查看它是否等于标志的精确组合,再次针对该组合进行测试:

if( Model.CurrentContext.CurrentAccessModifierType == (AccessModifierType.Private & AccessModifierType.Static))
...

要了解这一点,请记住枚举实际上只是一个数字。因此,如果您的枚举具有 Private 值,则它只是存储为 8,因此只需测试它是否等于 8(或 Private)。如果它是私有的和静态的,那么它是 8 + 16 = 24。所以要测试它是否是这两者,那么只需测试它是否等于 24(或私有和静态)。

于 2012-05-01T08:35:47.533 回答