Created
December 15, 2021 20:54
-
-
Save RobertClassen/1cb766b9ce6bbfaa1482f2a36f690995 to your computer and use it in GitHub Desktop.
C# Enum Flags Extension Methods
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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