0
点赞
收藏
分享

微信扫一扫

将不确定变为确定~Flag特性的枚举是否可以得到Description信息

之前我写过对于普通枚举类型对象,输出Description特性信息的方法,今天主要来说一下,如何实现位域Flags枚举元素的Description信息的方法。

对于一个普通枚举对象,它输出描述信息是这样的

public enum Status
{
[Description("正常")]
Normal = -1,
[Description("删除")]
Deletet = 0,
[Description("冻结")]
Freezed = 1,
}

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());

将不确定变为确定~Flag特性的枚举是否可以得到Description信息_位域

作者:仓储大叔,张占岭,
荣誉:微软MVP

举报

相关推荐

0 条评论