Exemplo n.º 1
0
            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(),
                    };
            }