Skip to content

Instantly share code, notes, and snippets.

@RobertClassen
Created December 15, 2021 20:54
Show Gist options
  • Save RobertClassen/1cb766b9ce6bbfaa1482f2a36f690995 to your computer and use it in GitHub Desktop.
Save RobertClassen/1cb766b9ce6bbfaa1482f2a36f690995 to your computer and use it in GitHub Desktop.
C# Enum Flags Extension Methods
namespace MyNamespace
{
using NUnit.Framework;
public class Example
{
[Test]
public void Test()
{
MyEnum foo = MyEnum.None;
Assert.IsFalse(MyEnum.All.ContainsAny(foo));
foo = foo.Add(MyEnum.A);
Assert.IsTrue(MyEnum.All.ContainsAny(foo));
foo = foo.Add(MyEnum.B).Remove(MyEnum.A);
Assert.IsFalse(foo.ContainsAll(MyEnum.AB));
Assert.IsTrue(foo.ContainsAll(MyEnum.B));
foo = foo.Toggle(MyEnum.C);
Assert.IsTrue(foo.ContainsAll(MyEnum.BC));
foo = foo.Set(MyEnum.A, true);
Assert.IsTrue(MyEnum.All.ContainsAll(foo));
foo = foo.Set(MyEnum.AC, false);
Assert.IsFalse(foo.ContainsAny(MyEnum.A));
Assert.IsTrue(foo.ContainsAny(MyEnum.B));
Assert.IsFalse(foo.ContainsAny(MyEnum.C));
}
}
}
namespace MyNamespace
{
[System.Flags]
public enum MyEnum
{
None = 0,
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
AB = A | B,
AC = A | C,
BC = B | C,
All = ~None,
}
}
namespace MyNamespace
{
public static class MyEnumExtensions
{
public static MyEnum Add(this MyEnum @enum, MyEnum flags)
{
return @enum |= flags;
}
public static bool ContainsAny(this MyEnum @enum, MyEnum flags)
{
return (@enum & flags) > 0;
}
public static bool ContainsAll(this MyEnum @enum, MyEnum flags)
{
return (@enum & flags) == flags;
}
public static MyEnum Remove(this MyEnum @enum, MyEnum flags)
{
return @enum &= ~flags;
}
public static MyEnum Set(this MyEnum @enum, MyEnum flags, bool isEnabled)
{
return isEnabled ? @enum.Add(flags) : @enum.Remove(flags);
}
public static MyEnum Toggle(this MyEnum @enum, MyEnum flags)
{
return @enum ^= flags;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment