using System; using System.Collections.Generic; using System.Linq; namespace Sony.Filtr.Utility.Extensions { public static class EnumExtensions { public static Nullable ParseAsEnumNullable(this string value) where T : struct { return Enum.TryParse(value, out T result) ? result : (Nullable)null; } public static T ParseAsEnum(this string value) where T : struct { return (T)Enum.Parse(typeof(T), value, true); } public static (T1, T2)[] EnumMultiply() where T1 : struct where T2 : struct { return GetEnumValues().SelectMany(t1 => GetEnumValues().Select(t2 => (t1, t2))).ToArray(); } public static T[] GetEnumValues() where T : struct { return (T[])Enum.GetValues(typeof(T)); } public static IEnumerable GetFlags(this Enum value) { return GetFlags(value, Enum.GetValues(value.GetType()).Cast().ToArray()); } public static IEnumerable GetIndividualFlags(this Enum value) { return GetFlags(value, GetFlagValues(value.GetType()).ToArray()); } private static IEnumerable GetFlags(Enum value, Enum[] values) { ulong bits = Convert.ToUInt64(value); List results = new List(); for (int i = values.Length - 1; i >= 0; i--) { ulong mask = Convert.ToUInt64(values[i]); if (i == 0 && mask == 0L) break; if ((bits & mask) == mask) { results.Add(values[i]); bits -= mask; } } if (bits != 0L) return Enumerable.Empty(); if (Convert.ToUInt64(value) != 0L) return results.Reverse(); if (bits == Convert.ToUInt64(value) && values.Length > 0 && Convert.ToUInt64(values[0]) == 0L) return values.Take(1); return Enumerable.Empty(); } private static IEnumerable GetFlagValues(Type enumType) { ulong flag = 0x1; foreach (var value in Enum.GetValues(enumType).Cast()) { ulong bits = Convert.ToUInt64(value); if (bits == 0L) //yield return value; continue; // skip the zero value while (flag < bits) flag <<= 1; if (flag == bits) yield return value; } } } }