为枚举创建自定义DisplayAttribute?

时间:2016-12-21 22:04:48

标签: c# asp.net enums displayattribute

我有一个枚举课......

public enum LeadStatus : byte
{
    [Display(Name = "Created")] Created = 1,
    [Display(Name = "Assigned")] Assigned = 2,
    ....
}

Name当然是开箱即用的。来自MetaData ......

namespace System.ComponentModel.DataAnnotations
{
    public sealed class DisplayAttribute : Attribute
    {
        ...
        public string Name { get; set; }
        ...
    }
}

假设我想要自己的自定义显示属性,例如“BackgroundColor”......

[Display(Name = "Created", BackgroundColor="green")] Created = 1

我在这里看到了一些其他线索,围绕这个问题跳舞,但是背景不同,我无法使它发挥作用。我假设我需要创建某种扩展/覆盖类,但我并没有想到这一点。

谢谢!

3 个答案:

答案 0 :(得分:3)

拥有自己的属性。

public sealed class ExtrasDisplayAttribute : Attribute
{
    public string Name { get; set; }
    public string BackgroundColor { get; set; }
}

这种扩展方法。

namespace ExtensionsNamespace
{
    public static class Extensions
    {
        public static TAttribute GetAttribute<TAttribute>(Enum value) where TAttribute : Attribute
        {
            return value.GetType()
                .GetMember(value.ToString())[0]
                .GetCustomAttribute<TAttribute>();
        }
    }
}

现在你可以像这样从枚举中提取属性。

using static ExtensionsNamespace.Extensions;

//...

var info = GetAttribute<ExtrasDisplayAttribute>(LeadStatus.Created);
var name = info.Name;
var bg = info.BackgroundColor;

//...

public enum LeadStatus : byte
{
    [ExtrasDisplay(Name = "Created", BackgroundColor = "Red")] Created = 1,
    [ExtrasDisplay(Name = "Assigned")] Assigned = 2,
}

如果您仍想使用原始属性,也可以使用原始属性。 你应该将这两个属性应用于单个枚举。

public enum LeadStatus : byte
{
    [Display(Name = "Created"), ExtrasDisplay(BackgroundColor = "Red")]Created = 1,
    [Display(Name = "Assigned")] Assigned = 2,
}

并提取你想要的每一个。

var name = GetAttribute<DisplayAttribute>(LeadStatus.Created).Name;
var bg = GetAttribute<ExtrasDisplayAttribute>(LeadStatus.Created).BackgroundColor;

答案 1 :(得分:2)

public sealed class DisplayAttribute : Attribute是一个密封类,因此您无法继承它并向其添加其他行为或属性。

以下是我的假设,但如果他们知道为什么

,有人可以插话

您可能想知道为什么.NET开发人员将其密封?我想知道同样的,我的假设是因为DisplayAttribute中的每个属性都用于注入javascript,html等。如果他们将其打开,并且你添加了BackgroundColor属性,那么那意思是?用户界面会做什么?

答案 2 :(得分:0)

得出结论这是不可能的,我采用了另一种解决方案。不像我原先希望的那样整洁,但它仍然可以完成任务。

Methods inside enum in C#