回到目录
之前我写过对于普通枚举类型对象,输出Description特性信息的方法,今天主要来说一下,如何实现位域Flags枚举元素的Description信息的方法。
对于一个普通枚举对象,它输出描述信息是这样的
public enum Status{[Description("正常")]Normal = -1,[Description("删除")]Deletet = 0,[Description("冻结")]Freezed = 1,}
Status status = Status.Normal;Console.WriteLine(status.GetDescription());
而对于支持位域Flags特性的枚举来说,在使用GetDescription方法时,是不能实现的,我们需要对它进行一些改造。
[Flags]public enum Ball{[Description("足球")]FootBall = 1,[Description("篮球")]BasketBall = 2,[Description("乒乓球")]PingPang = 4,}
/// <summary>/// 枚举类型扩展方法/// </summary>public static class EnumExtensions{/// <summary>/// 得到Flags特性的枚举的集合/// </summary>/// <param name="value"></param>/// <returns></returns>static List<Enum> GetEnumValuesFromFlagsEnum(Enum value){List<Enum> values = Enum.GetValues(value.GetType()).Cast<Enum>().ToList();List<Enum> res = new List<Enum>();foreach (var itemValue in values){if ((value.GetHashCode() & itemValue.GetHashCode()) != 0)res.Add(itemValue);}return res;}/// <summary> /// 获取枚举变量值的 Description 属性 /// </summary> /// <param name="obj">枚举变量</param> /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns> public static string GetDescription(this Enum obj){string description = string.Empty;try{Type _enumType = obj.GetType();DescriptionAttribute dna = null;FieldInfo fi = null;var fields = _enumType.GetCustomAttributesData();if (!fields.Where(i => i.Constructor.DeclaringType.Name == "FlagsAttribute").Any()){fi = _enumType.GetField(Enum.GetName(_enumType, obj));dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));if (dna != null && string.IsNullOrEmpty(dna.Description) == false)return dna.Description;return null;}GetEnumValuesFromFlagsEnum(obj).ToList().ForEach(i =>{fi = _enumType.GetField(Enum.GetName(_enumType, i));dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));if (dna != null && string.IsNullOrEmpty(dna.Description) == false)description += dna.Description + ",";});return description.EndsWith(",")? description.Remove(description.LastIndexOf(',')): description;}catch{throw;}}}
它在赋值后,输出是这样的
Ball ball = Ball.BasketBall | Ball.FootBall;
Console.WriteLine(ball.GetDescription());
回到目录