C# enum枚举类型的遍历

简要说明

枚举的遍历,我第一次遇到是在编写视频播放时,用的是VLC API接口,其中要对播放对象进行事件监听,而其事件是枚举类型,数量较多,要一次注册代码太长了,所以想到了枚举遍历。其实枚举遍历也是一种非常重要且十分常见的编程技术,在嵌入式系统中,对I/O端口操作,也是常采用枚举遍历,进而能快速找出要操作的I/O端口。经过搜索学习,得到了以下两种方法。

方法一:

利用枚举类型的GetValues()方法。首先应定义一个类来表示枚举的一个字段名和对应的值。比如

    class EnumItemInfo
    {
        public string name { get; set; }
        public int value { get; set; }
    }

其次就是遍历取值,将其放入List,我们以下面枚举对象举例

  enum Days
  {
      Sun,
      Mon,
      tue,
      Wed,
      thu,
      Fri,
      Sat
  };

枚举遍历语句

List<EnumItemInfo> enumList = new List<EnumItemInfo>();
foreach (Days day in Enum.GetValues(typeof(Days)))
{
    EnumItemInfo item = new EnumItemInfo();
    item.name = day.ToString();
    item.value = day.GetHashCode();
    enumList.Add(item);
}

这样enumList就取得枚举的遍历值了。

方法二

这个方法还可以取到枚举的描述部分,我们把上面的EnumItemInfo类扩展一下

    class EnumItemInfo
    {
        public string Description { get; set; }
        public string name { get; set; }
        public int value { get; set; }
    }

枚举也增加上描述项

enum Days
{
    [Description("星期日")]
    Sun,

    [Description("星期一")]
    Mon,

    [Description("星期二")]
    tue,

    [Description("星期三")]
    Wed,

    [Description("星期四")]
    thu,

    [Description("星期五")]
    Fri,

    [Description("星期六")]
    Sat
};

主要部分就是这个转换的类

    public static class CommonEnumTool
    {
        /// <summary>
        /// 根据枚举值类型获取枚举信息List
        /// </summary>
        /// <returns></returns>
        public static List<EnumItemInfo> GetListFromEnum<T>()
        {
            //反射 循环 获取数据
            Type t = typeof(T);
            List<EnumItemInfo> itemList = new List<EnumItemInfo>();
            FieldInfo[] fieldInfos = t.GetFields();
            foreach (var item in fieldInfos)
            {
                //不是枚举字段不处理
                if (item.FieldType.IsEnum)
                {
                    //名称可以直接获取
                    EnumItemInfo itemInfo = new EnumItemInfo()
                    {
                        name = item.Name
                    };
                    //获取值
                    itemInfo.value = (int)t.InvokeMember(item.Name, BindingFlags.GetField, null, null, null);
                    //获取注解
                    Type typeDescription = typeof(DescriptionAttribute);
                    DescriptionAttribute arr = item.GetCustomAttributes(typeDescription, true).FirstOrDefault() as DescriptionAttribute;
                    itemInfo.Description = arr?.Description ?? "";

                    itemList.Add(itemInfo);
                }
            }
            return itemList;
        }

        /// <summary>
        /// 根据枚举值获取枚举Description
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="val"></param>
        /// <returns></returns>
        public static string GetEnumDescriptionFromValue<T>(T val)
        {
            Type t = typeof(T);
            MemberInfo[] field = t.GetMember(val.ToString());
            object[] attrs = field?.FirstOrDefault().GetCustomAttributes(typeof(DescriptionAttribute), true);
            string description = ((DescriptionAttribute)attrs.FirstOrDefault()).Description;
            return description;
        }
    }

那么定义好后,就用下面的一条很简单的语句调用,:

List<EnumItemInfo> dayList = CommonEnumTool.GetListFromEnum<Days>();

这样dayList就直接得到Days的遍历结果了。

另外可以获取Days的某一字段的描述,比如星期五的语句

string Description = CommonEnumTool.GetEnumDescriptionFromValue<Days>(Days.Fri);

Description就得到“星期五”

小结

以上就是枚举两种遍历方法,第一种简单明了,第二种虽然语句有些长,但是调用起来也很简单,并且能得到相应字段的描述部分。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值