Пример #1
0
        public static List <EnumItem> GetEnumItems(Type enumType, EnumSortType enumSortType)
        {
            List <EnumItem> list = new List <EnumItem>();

            Array array = Enum.GetValues(enumType);

            for (int i = 0; i < array.Length; i++)
            {
                int    value = (int)array.GetValue(i);
                string name  = Enum.GetName(enumType, value);

                EnumProperty ep = GetEnumProperty(enumType, value);
                if (ep == null)
                {
                    ep = new EnumProperty(string.Empty, 0);
                }

                EnumItem item = new EnumItem()
                {
                    Name = name, Value = value, Description = ep.Description, Rank = ep.Rank
                };
                list.Add(item);
            }

            if (enumSortType != EnumSortType.Default)
            {
                list.Sort(new EnumComparer(enumSortType));
            }

            return(list);
        }
Пример #2
0
        /// <summary>
        /// 得到枚举类型定义的所有文本,按定义的顺序返回
        /// </summary>
        /// <exception cref="NotSupportedException"></exception>
        /// <param name="enumType">枚举类型</param>
        /// <param name="sortType">指定排序类型</param>
        /// <returns>所有定义的文本</returns>
        public static IEnumDescription[] GetEnumDescriptions(Type enumType, EnumSortType sortType = EnumSortType.Default)
        {
            if (!CachedEnum.Contains(enumType.FullName))
            {
                lock (_locker)
                {
                    if (!CachedEnum.Contains(enumType.FullName))
                    {
                        var fields        = enumType.GetFields();
                        var descArrayList = new ArrayList();
                        var enumIdx       = 0;
                        foreach (var field in fields)
                        {
                            if (field.IsSpecialName)
                            {
                                continue;
                            }
                            var enumDescAttrs = field.GetCustomAttributes(typeof(EnumDescriptionAttribute), false);
                            EnumDescriptionAttribute enumDescAttr;
                            if (enumDescAttrs.Any())
                            {
                                enumDescAttr = ((EnumDescriptionAttribute)enumDescAttrs[0]);
                            }
                            else
                            {
                                var descAttrs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
                                var descStr   = field.Name;
                                if (descAttrs.Any())
                                {
                                    descStr = ((DescriptionAttribute)descAttrs[0]).Description;
                                }
                                enumDescAttr = new EnumDescriptionAttribute(descStr, enumIdx++);
                            }
                            enumDescAttr.Name  = field.Name;
                            enumDescAttr.Value = field.GetValue(enumType).GetHashCode();
                            descArrayList.Add(enumDescAttr);
                        }
                        ;
                        CachedEnum.Add(enumType.FullName, descArrayList.ToArray(typeof(IEnumDescription)));
                    }
                }
            }
            var descriptions = (IEnumDescription[])CachedEnum[enumType.FullName];

            //默认就不排序了
            if (sortType != EnumSortType.Default)
            {
                //按指定的属性冒泡排序
                for (int m = 0; m < descriptions.Length; m++)
                {
                    for (int n = m; n < descriptions.Length; n++)
                    {
                        var swap = false;

                        switch (sortType)
                        {
                        case EnumSortType.Description:
                            if (string.CompareOrdinal(descriptions[m].Description, descriptions[n].Description) > 0)
                            {
                                swap = true;
                            }
                            break;

                        case EnumSortType.Index:
                            if (descriptions[m].Index > descriptions[n].Index)
                            {
                                swap = true;
                            }
                            break;
                        }

                        if (swap)
                        {
                            var temp = descriptions[m];
                            descriptions[m] = descriptions[n];
                            descriptions[n] = temp;
                        }
                    }
                }
            }
            ;

            return(descriptions);
        }
Пример #3
0
 public EnumComparer(EnumSortType sortType)
 {
     this.sortType = sortType;
 }