static Cache() { Type = typeof(T); UnderlyingType = Enum.GetUnderlyingType(Type); Values = (Enum.GetValues(Type) as T[]).AsReadOnly(); Names = Enum.GetNames(Type).Select(string.Intern).ToReadOnlyArray(); Members = Names.Select(x => new Member <T>(x)).ToReadOnlyArray(); MinValue = Values.DefaultIfEmpty().Min(); MaxValue = Values.DefaultIfEmpty().Max(); IsEmpty = Values.Count == 0; IsFlags = Attribute.IsDefined(Type, typeof(FlagsAttribute)); var distinctedMember = Members.OrderBy(x => x.Value).Distinct(new Member <T> .ValueComparer()).ToArray(); MemberByName = Members.ToFrozenStringKeyDictionary(x => x.Name); UnderlyingOperation = Type.GetTypeCode(Type) switch { TypeCode.SByte => SByteOperation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.Byte => ByteOperation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.Int16 => Int16Operation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.UInt16 => UInt16Operation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.Int32 => Int32Operation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.UInt32 => UInt32Operation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.Int64 => Int64Operation <T> .Create(MinValue, MaxValue, distinctedMember), TypeCode.UInt64 => UInt64Operation <T> .Create(MinValue, MaxValue, distinctedMember), _ => throw new InvalidOperationException(), }; }