在开发应用中,我们经常用枚举来简化程序。但是让人头的是总得枚举一个别名Alias用于显示或者描述该枚举值,这时候如果我们采用if或者switch的方法来进行判读也可以,但是有点不够优雅。下面来给大家分享一下我的实现方法。今天同事把博客园里的一片文章发给我说和我之前推荐给大家的方法思路基本一样。看后感觉非常不错,于是兴起把我的思路也发布出来与大家一起分享一下。(欢迎一起交流)
首先应该想到的是Attribute(在编译期初始化,用于给对象附加信息),这才是他的本职工作。首先我们就可以想到System.ComponentModel命名空间下的DescriptionAttribute,用它来担当记录描述的职责再合适不过了。有的朋友自己定义扩展一个Attribute也可以只是必要性不大。
Enum是可以支持按位运算的,来表达32个状态。所以,在业务中我们经常需要用一个变量来表达多个状态,比如枚举在订单状态中的应用,所以我们需要考虑对于被FlagsAttribute标记的枚举对象的描述信息的提取问题。
a.由于采用this static扩展所以对于方法的调用非常方便。
b.采用泛型约束,对扩展方法加以限制,否则在很多不相干的类型后面都能看见这个扩展;
c.支持FlagsAttribute[Flags]位运算处理;
d.可能有得朋友,看到感觉很复杂,其实我们写东西的目的就是为了“客户”方便好用。逻辑复杂,只要思路清晰就好;
/// <summary>
/// 返回枚举类型的中文描述 DescriptionAttribute 指定的名字
/// </summary>
/// <typeparam name="TEnum"></typeparam>
/// <param name="Enum"></param>
/// <returns></returns>
public static string Description<TEnum>(this TEnum Enum) where TEnum : struct
{
var returnStr = "";
var em = Enum.ToString();
var emArr = em.Split(',');
foreach (var s in emArr)
{
returnStr += ((TEnum)System.Enum.Parse(typeof(TEnum), s)).GetDescription();
}
/*
这里可以用linq中的累加器Aggregate来进行替代,鉴于代码易读采用foreach,可被替换为如下更简洁的代码
return emArr.Aggregate("", (current, s) => current + ((TEnum) System.Enum.Parse(typeof (TEnum), s)).GetDescription());
*/
return returnStr;
}
public static stringGetDescription<TEnum>(this TEnum Enum) where TEnum : struct
{
var em = Enum.ToString();
FieldInfo fieldInfo = Enum.GetType().GetField(em);
if (fieldInfo == null) return em;
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length < 1) return em;
return attributes[0].Description;
}
/// <summary>
/// 星期枚举
/// </summary>
[Flags]
public enum DaysOfWeek
{
[Description("星期日")]
Sunday = 0,
[Description("星期一")]
Monday = 1 << 0,
[Description("星期二")]
Tuesday = 1 << 1,
[Description("星期三")]
Wednesday = 1 << 2,
[Description("星期四")]
Thursday = 1 << 3,
[Description("星期五")]
Friday = 1 << 4,
[Description("星期六")]
Saturday = 1 << 5,
}
顺便把其他几个关于枚举的扩展一起发来,希望对大家有用哦
/// <summary>
/// 获取枚举类型转化为int值
/// </summary>
/// <typeparam name="TEnum"></typeparam>
/// <param name="thisStatus"></param>
/// <returns></returns>
public static int ToInt<TEnum>(this TEnum thisStatus) where TEnum : struct
{
return thisStatus.GetHashCode();
}
/// <summary>
/// 将枚举以字典的形式返回
/// </summary>
/// <typeparam name="TEnum"></typeparam>
/// <param name="enumObj"></param>
/// <returns></returns>
public static Dictionary<int, string> ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
{
var values = from TEnum e inEnum.GetValues(typeof(TEnum))
selectnewKeyValuePair<int, string>(e.GetHashCode(), e.ToString());
return values.ToDictionary(a => a.Key, b => b.Value);
}
/// <summary>
/// 返回枚举值列表
/// </summary>
/// <typeparam name="TEnum"></typeparam>
/// <param name="enumObj"></param>
/// <returns></returns>
public static List<TEnum> ToEnumList<TEnum>(this TEnum enumObj) where TEnum : struct
{
var values = from TEnum e inEnum.GetValues(typeof(TEnum))
select e;
return values.ToList();
}
/// <summary>
/// 转换成为枚举类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="strEnum"></param>
/// <returns></returns>
public static T ToEnum<T>(thisstring strEnum)
{
return (T)Enum.Parse(typeof(T), strEnum);
}