/// <summary> /// /// </summary> /// <param name="enumType"></param> /// <returns></returns> public static EnumItemCollection Get(Type enumType) { EnumItemCollection enumItems = null; if (!_typedEnumItemsCache.TryGetValue(enumType, out enumItems)) { enumItems = GetEnumItems(enumType); Add(enumType, enumItems); } return(enumItems); }
/// <summary> /// /// </summary> /// <param name="enumType"></param> /// <param name="enumItems"></param> private static void Add(Type enumType, EnumItemCollection enumItems) { if (!_typedEnumItemsCache.ContainsKey(enumType)) { lock (_syncObj) { if (!_typedEnumItemsCache.ContainsKey(enumType)) { _typedEnumItemsCache.Add(enumType, enumItems); } } } }
/// <summary> /// get the enum's all list /// </summary> /// <param name="enumType">the type of the enum</param> /// <param name="withAll">identicate whether the returned list should contain the all item</param> /// <returns></returns> private static EnumItemCollection GetEnumItems(Type enumType) { EnumItemCollection emumItems = new EnumItemCollection(); if (enumType.IsEnum != true) { // just whethe the type is enum type throw new InvalidOperationException(); } // 获得特性Description的类型信息 Type typeDescription = typeof(DescriptionAttribute); // 获得枚举的字段信息(因为枚举的值实际上是一个static的字段的值) FieldInfo[] fields = enumType.GetFields(); // 检索所有字段 foreach (FieldInfo field in fields) { // 过滤掉一个不是枚举值的,记录的是枚举的源类型 if (field.FieldType.IsEnum == false) { continue; } // 通过字段的名字得到枚举的值 int value = (int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null); string description = string.Empty; // 获得这个字段的所有自定义特性,这里只查找Description特性 object[] arr = field.GetCustomAttributes(typeDescription, true); if (arr.Length > 0) { // 因为Description自定义特性不允许重复,所以只取第一个 DescriptionAttribute descriptionAttri = (DescriptionAttribute)arr[0]; // 获得特性的描述值 description = descriptionAttri.Description; } else { // 如果没有特性描述,那么就显示英文的字段名 description = field.Name; } emumItems.Add(new EnumItem(field.Name, value, description)); } return(emumItems); }
/// <summary> /// get the Enum value according to the its decription /// </summary> /// <typeparam name="T">the type of the enum</typeparam> /// <param name="description">the description of the EnumValue</param> /// <returns></returns> public static T GetEnumByDescription <T>(string description) { if (string.IsNullOrEmpty(description)) { return(default(T)); } Type enumType = typeof(T); EnumItemCollection list = GetEnumItems(enumType); foreach (EnumItem item in list) { if (item.Description.ToString().ToLower() == description.Trim().ToLower()) { return((T)Enum.ToObject(typeof(T), item.Value)); } } return(default(T)); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="defaultValue"></param> /// <returns></returns> public static T GetEnumByKey <T>(string key, T defaultValue) { T item = defaultValue; EnumItem enumItem = null; try { Type enumType = typeof(T); EnumItemCollection enumItems = EnumItemsCache.Get(enumType); enumItems.TryGet(key, out enumItem); if (enumItem != null) { item = (T)Enum.ToObject(enumType, enumItem.Value); } } catch { item = defaultValue; } return(item); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value"></param> /// <param name="defaultValue"></param> /// <returns></returns> public static T GetEnumByValue <T>(string value, T defaultValue) { T item = defaultValue; try { EnumItemCollection enumItems = GetEnumItems(typeof(T)); foreach (EnumItem enumItem in enumItems) { if (enumItem.Value.ToString() == value) { item = (T)Enum.ToObject(typeof(T), enumItem.Value); } } } catch { item = defaultValue; } return(item); }
/// <summary> /// /// </summary> /// <param name="enumField"></param> /// <returns></returns> public static EnumItem GetEnumItem(Enum enumField) { EnumItemCollection enumItems = GetEnumItems(enumField.GetType()); return(enumItems[enumField.ToString()]); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="enumField"></param> /// <returns></returns> public static EnumItem GetEnumItem <T>(T enumField) { EnumItemCollection enumItems = GetEnumItems(typeof(T)); return(enumItems[enumField.ToString()]); }