Search code examples
c#.netenumsattributesflags

How to Compare Flags in C#?


I have a flag enum below.

[Flags]
public enum FlagTest
{
    None = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4
}

I cannot make the if statement evaluate to true.

FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;

if (testItem == FlagTest.Flag1)
{
    // Do something,
    // however This is never true.
}

How can I make this true?


Solution

  • In .NET 4 there is a new method Enum.HasFlag. This allows you to write:

    if ( testItem.HasFlag( FlagTest.Flag1 ) )
    {
        // Do Stuff
    }
    

    which is much more readable, IMO.

    The .NET source indicates that this performs the same logic as the accepted answer:

    public Boolean HasFlag(Enum flag) {
        if (!this.GetType().IsEquivalentTo(flag.GetType())) {
            throw new ArgumentException(
                Environment.GetResourceString(
                    "Argument_EnumTypeDoesNotMatch", 
                    flag.GetType(), 
                    this.GetType()));
        }
    
        ulong uFlag = ToUInt64(flag.GetValue()); 
        ulong uThis = ToUInt64(GetValue());
        // test predicate
        return ((uThis & uFlag) == uFlag); 
    }