枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型。
编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段。C#编译器将枚举类型视为基元类型。
1.获取枚举列表:
/// <summary>/// 获取枚举列表/// </summary>/// <param name="enumType">枚举的类型</param>/// <returns>枚举列表</returns>public static Dictionary<int, string> GetEnumList(Type enumType){var dic = new Dictionary<int, string>();try{var fd = enumType.GetFields();for (var index = 1; index < fd.Length; ++index){var info = fd[index];var fieldValue = System.Enum.Parse(enumType, fd[index].Name);var attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);foreach (EnumTextAttribute attr in attrs){var key = (int)fieldValue;if (key == -100) continue;var value = attr.Text;dic.Add(key, value);}}return dic;}catch (Exception ex){throw new Exception(ex.Message);}}
2.获取枚举名称:
/// <summary>/// 获取枚举名称/// </summary>/// <param name="enumType">枚举的类型</param>/// <param name="id">枚举值</param>/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>public static string GetEnumTextById(Type enumType, int id){var ret = string.Empty;try{var dic = GetEnumList(enumType);foreach (var item in dic){if (item.Key != id) continue;ret = item.Value;break;}return ret;}catch (Exception ex){throw new Exception(ex.Message);}}
3.根据枚举值获取对应中文描述:
/// <summary>/// 根据枚举值获取对应中文描述/// </summary>/// <param name="enumValue">枚举值</param>/// <returns>枚举值中文描述</returns>public static string GetEnumTextByEnum(object enumValue){var ret = string.Empty;if ((int)enumValue == -1) return ret;try{var dic = GetEnumList(enumValue.GetType());foreach (var item in dic){if (item.Key != (int)enumValue) continue;ret = item.Value;break;}return ret;}catch (Exception ex){throw new Exception(ex.Message);}}
4.获取枚举名称:
/// <summary>/// 获取枚举名称/// </summary>/// <param name="enumType">枚举的类型</param>/// <param name="index">枚举值的位置编号</param>/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>public static string GetEnumTextByIndex(Type enumType, int index){var ret = string.Empty;var dic = GetEnumList(enumType);if (index < 0 || index > dic.Count)return ret;var i = 0;foreach (var item in dic){if (i == index){ret = item.Value;break;}i++;}return ret;}
5.获取枚举值:
/// <summary>/// 获取枚举值/// </summary>/// <param name="enumType">枚举的类型</param>/// <param name="name">枚举名称</param>/// <returns>如果枚举名称存在,返回对应的枚举值,否则,返回-1</returns>public static int GetEnumIdByName(Type enumType, string name){var ret = -1;if (string.IsNullOrEmpty(name))return ret;var dic = GetEnumList(enumType);foreach (var item in dic){if (string.Compare(item.Value, name, StringComparison.Ordinal) != 0) continue;ret = item.Key;break;}return ret;}
6.获取名字对应枚举值:
/// <summary>/// 获取名字对应枚举值/// </summary>/// <typeparam name="T">枚举类型</typeparam>/// <param name="name">枚举名称</param>/// <returns></returns>public static T GetEnumIdByName<T>(string name) where T : new(){var type = typeof(T);var enumItem = (T)TypeDescriptor.GetConverter(type).ConvertFrom("-1");if (string.IsNullOrEmpty(name))return enumItem;try{var fd = typeof(T).GetFields();for (var index = 1; index < fd.Length; ++index){var info = fd[index];var fieldValue = System.Enum.Parse(type, fd[index].Name);var attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);if (attrs.Length != 1) continue;var attr = (EnumTextAttribute)attrs[0];if (!name.Equals(attr.Text)) continue;enumItem = (T)fieldValue;break;}return enumItem;}catch (Exception ex){throw new Exception(ex.Message);}}
7.获取枚举值所在的位置编号:
/// <summary>/// 获取枚举值所在的位置编号/// </summary>/// <param name="enumType">枚举的类型</param>/// <param name="name">枚举名称</param>/// <returns>如果枚举名称存在,返回对应的枚举值的位置编号,否则,返回-1</returns>public static int GetEnumIndexByName(Type enumType, string name){var ret = -1;if (string.IsNullOrEmpty(name))return ret;var dic = GetEnumList(enumType);var i = 0;foreach (var item in dic){if (string.Compare(item.Value, name, StringComparison.Ordinal) == 0){ret = i;break;}i++;}return ret;}