C#枚举类型的常用操作总结

来源:互联网 发布:身边低调的有钱人知乎 编辑:程序博客网 时间:2024/05/02 02:52

   枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从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;        }
复制代码
0 0