using System; using System.Collections.Generic; using System.Linq; using System.Reflection; public static class EnumExtensions { private static void CheckIsEnum(bool withFlags) { if (!typeof(T).IsEnum) throw new ArgumentException(string.Format("Type '{0}' is not an enum", typeof(T).FullName)); if (withFlags && !Attribute.IsDefined(typeof(T), typeof(FlagsAttribute))) throw new ArgumentException(string.Format("Type '{0}' doesn't have the 'Flags' attribute", typeof(T).FullName)); } public static bool HasFlag(this T value, T flag) where T : struct, IConvertible { CheckIsEnum(true); long lValue = Convert.ToInt64(value); long lFlag = Convert.ToInt64(flag); return (lValue & lFlag) != 0; } public static IEnumerable GetFlags(this T value) where T : struct, IConvertible { CheckIsEnum(true); foreach(T flag in Enum.GetValues(typeof(T)).Cast()) { if(value.HasFlag(flag)) yield return flag; } } public static T SetFlags(this T value, T flags, bool on) where T : struct, IConvertible { CheckIsEnum(true); long lValue = Convert.ToInt64(value); long lFlag = Convert.ToInt64(flags); if (on) lValue |= lFlag; else lValue &= (~lFlag); return (T)Enum.ToObject(typeof(T), lValue); } public static T SetFlags(this T value, T flags) where T : struct, IConvertible { return value.SetFlags(flags, true); } public static T ClearFlags(this T value, T flags) where T : struct, IConvertible { return value.SetFlags(flags, false); } public static T CombineFlags(this IEnumerable flags) where T : struct, IConvertible { CheckIsEnum(true); long lValue = 0; foreach (T flag in flags) { long lFlag = Convert.ToInt64(flag); lValue |= lFlag; } return (T)Enum.ToObject(typeof(T), lValue); } }