Skip to content

Instantly share code, notes, and snippets.

@kirillrybin
Forked from yagero/UtilsEnum.cs
Created July 15, 2018 21:45
Show Gist options
  • Save kirillrybin/a9935f8ef32c850672536f45e7347711 to your computer and use it in GitHub Desktop.
Save kirillrybin/a9935f8ef32c850672536f45e7347711 to your computer and use it in GitHub Desktop.
Enum.HasFlag in .NET 2 / Unity 5
public static class UtilsEnum
{
public static bool HasFlag(this Enum mask, Enum flags) // Same behavior than Enum.HasFlag is .NET 4
{
#if DEBUG
if (mask.GetType() != flags.GetType())
throw new System.ArgumentException(
string.Format("The argument type, '{0}', is not the same as the enum type '{1}'.",
flags.GetType(), mask.GetType()));
#endif
return ((int)(IConvertible)mask & (int)(IConvertible)flags) == (int)(IConvertible)flags;
}
}
// UNIT TESTS
internal class TestUtilsEnum
{
enum Flags
{
Null = 0,
Motor = 1 << 1,
Wheels = 1 << 2,
Trunk = 1 << 3,
Bike = Wheels,
Motocross = Wheels | Motor,
Car = Motor | Wheels | Trunk,
}
enum Flags2
{
Null = 0,
Motor = 1 << 1,
}
[Test]
public void EnumHasFlag()
{
Assert.IsTrue(Flags.Null.HasFlag(Flags.Null));
Assert.IsFalse(Flags.Null.HasFlag(Flags.Motor));
Assert.IsTrue(Flags.Car.HasFlag(Flags.Null));
Assert.IsTrue(Flags.Car.HasFlag(Flags.Motor));
Assert.IsTrue(Flags.Car.HasFlag(Flags.Trunk));
Assert.IsTrue(Flags.Car.HasFlag(Flags.Motor | Flags.Wheels));
Assert.IsTrue(Flags.Bike.HasFlag(Flags.Wheels));
Assert.IsFalse(Flags.Bike.HasFlag(Flags.Motor));
Assert.IsFalse(Flags.Bike.HasFlag(Flags.Wheels | Flags.Motor));
Assert.IsFalse(Flags.Bike.HasFlag(Flags.Motor | Flags.Trunk));
Assert.IsFalse(Flags.Wheels.HasFlag(Flags.Car));
#if DEBUG
Assert.Throws<ArgumentException>(() => Flags.Car.HasFlag(Flags2.Motor));
#endif
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment