2

我有一个枚举类...

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

Name当然是开箱即用的。从元数据...

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

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

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

我在这里看到了一些其他线程,有点围绕这个问题跳舞,但上下文不同,我无法让它工作。我假设我需要创建某种扩展/覆盖类,但我并没有在脑海中想象这一点。

谢谢!

4

3 回答 3

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;
于 2016-12-21T22:16:42.617 回答
2

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

以下是我的假设,但如果他们知道为什么有人可以插话

您可能想知道为什么 .NET 开发人员将其密封?我想知道同样的问题,我的假设是因为其中的每个属性DisplayAttribute都用于注入 javascript、html 等。如果它们保持打开状态,并且您向其中添加了一个BackgroundColor属性,那是什么意思?在 UI 中会做什么?

于 2016-12-21T22:30:33.877 回答
0

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

C#中枚举中的方法

于 2016-12-21T23:32:49.160 回答