我有一个枚举类型
public enum DataType:int
{
None = 0,
[Description("A")]
Alpha = 1,
[Description("N")]
Numeric,
[Description("AN")]
AlphaNumeric,
[Description("D")]
Date
}
如何检索 Alpha 的描述属性值。
例如(理想):DataType.Alpha.Attribute
应该给出"A"
使用这个
private string GetEnumDescription(Enum value)
{
// Get the Description attribute value for the enum value
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0)
return attributes[0].Description;
else
return value.ToString();
}
我有一个扩展方法来做到这一点:
public static string GetDescription(this Enum enumValue)
{
//Look for DescriptionAttributes on the enum field
object[] attr = enumValue.GetType().GetField(enumValue.ToString())
.GetCustomAttributes(typeof (DescriptionAttribute), false);
if (attr.Length > 0) // a DescriptionAttribute exists; use it
return ((DescriptionAttribute) attr[0]).Description;
//The above code is all you need if you always use DescriptionAttributes;
//If you don't, the below code will semi-intelligently
//"humanize" an UpperCamelCased Enum identifier
string result = enumValue.ToString();
//"FooBar" -> "Foo Bar"
result = Regex.Replace(result, @"([a-z])([A-Z])", "$1 $2");
//"Foo123" -> "Foo 123"
result = Regex.Replace(result, @"([A-Za-z])([0-9])", "$1 $2");
//"123Foo" -> "123 Foo"
result = Regex.Replace(result, @"([0-9])([A-Za-z])", "$1 $2");
//"FOOBar" -> "FOO Bar"
result = Regex.Replace(result, @"(?<!^)(?<! )([A-Z][a-z])", " $1");
return result;
}
用法:
var description = DataType.Alpha.GetDescription(); //"A"
public enum TestEnums
{
IAmAComplexABCEnumValue,
}
//"I Am A Complex ABC Enum Value"
var complexCamelCasedDescription = TestEnums.IAmAComplexABCEnumValue.GetDescription();
我创建了一个自定义泛型方法来从枚举中获取任何属性值。
public static class EnumHelper
{
public static string GetAttributeValueByEnumValue<EnumType, AttributeType>(EnumType value, string attributeProperty = null)
where EnumType : Enum
where AttributeType : Attribute
{
var enumField = value.GetType().GetField(value.ToString());
var enumAttributes = enumField?.GetCustomAttributes(typeof(AttributeType), false) as AttributeType[];
if (enumAttributes == null || !enumAttributes.Any())
throw new Exception($"Attribute [{typeof(AttributeType).Name}] not found in enum [{typeof(EnumType).Name}] type with value [{value.ToString()}]!");
var enumAttribute = enumAttributes.First();
var attributeValue = enumAttribute
.GetType()
?.GetProperty(!string.IsNullOrEmpty(attributeProperty) ? attributeProperty : typeof(AttributeType).Name.Replace("Attribute", string.Empty))
?.GetValue(enumAttribute);
if (attributeValue == null)
throw new Exception("Error reading enum attribute value!");
return attributeValue.ToString();
}
}
要使用它,只需像下面这样调用它:
EnumHelper.GetAttributeValueByEnumValue<EnumLookup, DescriptionAttribute>(enumValue);
对于自定义枚举,您还可以提供属性属性名称,如下所示:
EnumHelper.GetAttributeValueByEnumValue<EnumLookup, TitleAttribute>(enumValue, "TitleName");
我希望它对你有所帮助:)