将不确定变为确定~Flag特性的枚举是否可以得到Description信息
之前我写过对于普通枚举类型对象,输出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());