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); }
/// <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); }
public EnumComparer(EnumSortType sortType) { this.sortType = sortType; }