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

    枚举类型是定义了一组“符号名称/值”配对。枚举类型是强类型的。每个枚举类型都是从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 条评论
登录 后参与评论

相关文章

来自专栏韦弦的微信小程序

Swift 有效的字母异位词 - LeetCode

那么题目就变成了判读两个字符串的组成元素是否是一样的,我们用两个数组获取字符串的所有组成元素,然后排序后比较是否相等:

942
来自专栏lhyt前端之路

关于JS的正则表达式0.前言1.捕获2.非捕获3.匹配模式彩蛋:

本文主要介绍了捕获和非捕获的概念,并举了一些例子,这些都是正则表达式在js中进阶的一些用法。后面有彩蛋哦

762
来自专栏C/C++基础

Google C++编程风格指南(四)之类的相关规范

类是C++中基本的代码单元,自然被广泛使用。本节列举了在写一个类时要做什么、不要做什么。

802
来自专栏大数据钻研

44 个 JavaScript 变态题解析

当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题...

3306
来自专栏Java开发者杂谈

Ruby(3):基本语法中

字符串分割成数组: 可以使用先scan再join的方法,当然其实有更好的 split方法,专门用来分割字符串 1 # 在Ruby中,如果不使用inspect...

34915
来自专栏互联网开发者交流社区

Java逻辑

1244
来自专栏mathor

LeetCode164. 最大间距

 这道题用到了桶排序的思想,但是跟排序没啥关系,思路是这样的,数组中有n个元素,那么就构建n+1个桶,桶的属性有三个,最大值最小值以及是否为空。桶的下标从0...

522
来自专栏calvin

【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--参数自动映射篇(6/8)

路由、action的扫描、发现、注册搞定之后,后来我发现在我们的action里面获取参数往往都是通过request对象来一个一个获取。同样的一行代码我们不厌其烦...

822
来自专栏hbbliyong

[译]WebAPI下的如何实现参数绑定

本文将概述在WebAPI方式下将如何将参数绑定到一个action方法,包括参数是如何被读取,一系列规则决定特定环境采用的那种绑定方式,文章最后将给出一些实际的例...

3626
来自专栏前端知识分享

第158天:面向对象入门

在这里我们可以理解为创造对象的几种模式:单例模式,工厂模式,构造函数模式,原型模式等。

692

扫码关注云+社区