dotnet核心中的Enum Description属性

时间:2016-05-18 17:04:18

标签: .net .net-core .net-core-rc2 dotnet-cli

我们在dot net CLI中是否有枚举的Description属性? (Dot Net Core RC2) 如果没有,还有其他选择吗?

6 个答案:

答案 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 ?? "";
    }