我有一个枚举课......
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
我在这里看到了一些其他线索,围绕这个问题跳舞,但是背景不同,我无法使它发挥作用。我假设我需要创建某种扩展/覆盖类,但我并没有想到这一点。
谢谢!
答案 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)
得出结论这是不可能的,我采用了另一种解决方案。不像我原先希望的那样整洁,但它仍然可以完成任务。