/// <summary>
/// 扩展方法,获得枚举的Description
/// </summary>
/// <param name="nameInstead">如果枚举值没有定义Description,是否使用枚举的名称代替
</param>
/// <returns>枚举的Description</returns>
public static string GetDescription(this Enum value, bool nameInstead = true)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (string.IsNullOrEmpty(name))
{
return null;
}
FieldInfo field = type.GetField(name);
DescriptionAttribute attribute = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attribute == null && nameInstead)
{
return name;
}
return attribute?.Description;
}
/// <summary>
/// 根据Description获取枚举值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T GetValueByDescription<T>(this string description) where T : struct
{
Type type = typeof(T);
foreach (var field in type.GetFields())
{
if (field.Name == description)
{
return (T)field.GetValue(null);
}
var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attributes != null && attributes.FirstOrDefault() != null)
{
if (attributes.First().Description == description)
{
return (T)field.GetValue(null);
}
}
}
throw new ArgumentException(string.Format("{0} 未能找到对应的枚举.", description), "Description");
}