简要说明
枚举的遍历,我第一次遇到是在编写视频播放时,用的是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就得到“星期五”
小结
以上就是枚举两种遍历方法,第一种简单明了,第二种虽然语句有些长,但是调用起来也很简单,并且能得到相应字段的描述部分。