12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- public static class EnumExtensions
- {
- private static void CheckIsEnum<T>(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<T>(this T value, T flag) where T : struct, IConvertible
- {
- CheckIsEnum<T>(true);
- long lValue = Convert.ToInt64(value);
- long lFlag = Convert.ToInt64(flag);
- return (lValue & lFlag) != 0;
- }
- public static IEnumerable<T> GetFlags<T>(this T value) where T : struct, IConvertible
- {
- CheckIsEnum<T>(true);
- foreach(T flag in Enum.GetValues(typeof(T)).Cast<T>())
- {
- if(value.HasFlag(flag))
- yield return flag;
- }
- }
- public static T SetFlags<T>(this T value, T flags, bool on) where T : struct, IConvertible
- {
- CheckIsEnum<T>(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<T>(this T value, T flags) where T : struct, IConvertible
- {
- return value.SetFlags(flags, true);
- }
- public static T ClearFlags<T>(this T value, T flags) where T : struct, IConvertible
- {
- return value.SetFlags(flags, false);
- }
- public static T CombineFlags<T>(this IEnumerable<T> flags) where T : struct, IConvertible
- {
- CheckIsEnum<T>(true);
- long lValue = 0;
- foreach (T flag in flags)
- {
- long lFlag = Convert.ToInt64(flag);
- lValue |= lFlag;
- }
- return (T)Enum.ToObject(typeof(T), lValue);
- }
- }
|