我们在dot net CLI中是否有枚举的Description
属性? (Dot Net Core RC2)
如果没有,还有其他选择吗?
答案 0 :(得分:13)
对于1.0和1.1,DescriptionAttribute
现在位于System.ComponentModel.Primitives
NuGet包中。
答案 1 :(得分:9)
我将此用于我的Net Framework实现:
public static class EnumerationExtension
{
public static string Description( this Enum value )
{
// get attributes
var field = value.GetType().GetField( value.ToString() );
var attributes = field.GetCustomAttributes( typeof( DescriptionAttribute ), false );
// return description
return attributes.Any() ? ( (DescriptionAttribute)attributes.ElementAt( 0 ) ).Description : "Description Not Found";
}
}
这对NetCore不起作用,所以我修改了它来执行此操作:
public static class EnumerationExtension
{
public static string Description( this Enum value )
{
// get attributes
var field = value.GetType().GetField( value.ToString() );
var attributes = field.GetCustomAttributes( false );
// Description is in a hidden Attribute class called DisplayAttribute
// Not to be confused with DisplayNameAttribute
dynamic displayAttribute = null;
if (attributes.Any())
{
displayAttribute = attributes.ElementAt( 0 );
}
// return description
return displayAttribute?.Description ?? "Description Not Found";
}
}
枚举示例:
public enum ExportTypes
{
[Display( Name = "csv", Description = "text/csv" )]
CSV = 0
}
添加静态的示例用法:
var myDescription = myEnum.Description();
答案 2 :(得分:3)
DescriptionAttribute
was added to CoreFX,但仅限于RC2之后。所以它将在RTM版本中存在,但不在RC2中。根据您的目的,创建自己的属性可能会有效。
答案 3 :(得分:2)
我不得不修改@yaniv的答案以使用DescriptionAttribute
类型并获得Description
字段。
public static class EnumExtensions
{
/// <summary>
/// Get the Description from the DescriptionAttribute.
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDescription(this Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute<DescriptionAttribute>()?
.Description ?? string.Empty;
}
}
答案 4 :(得分:1)
您可以使用“ DisplayAttribute”并执行
public static string Description(this Enum enumValue)
{
return enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute<DisplayAttribute>()
.GetDescription();
}
答案 5 :(得分:1)
为了避免按照@pamcevoj 的回答使用 System.Reflection 并按照@HouseCat 的回答使用动态,我在基于@HouseCat 的解决方案构建的 .NET Core 3.1 中找到了这个解决方案
public static string Description(this Enum enumValue)
{
var descriptionAttribute = enumValue.GetType()
.GetField(enumValue.ToString())
.GetCustomAttributes(false)
.SingleOrDefault(attr => attr.GetType() == typeof(DescriptionAttribute)) as DescriptionAttribute;
// return description
return descriptionAttribute?.Description ?? "";
}