Enum flagsattribute

I am trying to evaluate an enum using FlagsAttribute as shown below. The problem is the ridiculous amount of code that it takes to ensure that the correct if statement is executed. I have four if statements that should only be executed if specific enumeration combinations are given, but nothing else :

  • Private, static
  • Private
  • Privileged
  • Public

Detecting the presence of the necessary flags is easy, but I must also ensure that no other flags are set, which are an absurd amount of code to enter and look like a maintenance nightmare.

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

Can someone rewrite this if statement more concisely?

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){
}
+3
4

, ( , Infer - ?), , ( OR)?

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

-, 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"

+1

, , , :

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

, , :

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

, , . , Private, 8, , 8 ( Private). Private Static, 8 + 16 = 24. , , , , eqaul 24 ( Private Static).

0

- , .

AccessModifierType modifier = Model.CurrentContext.CurrentAccessModifierType;
if (modifier.Has(AccessModifierType.Public) && 
    modifier.Has(AccessModifierType.Static) &&
    modifier.Has(AccessModifierType.Privileged) && 
    modifier.Has(AccessModifierType.Private))
{
}
0

All Articles