gpt4 book ai didi

c# - 为枚举创建自定义 DisplayAttribute?

转载 作者:太空宇宙 更新时间:2023-11-03 19:49:42 26 4
gpt4 key购买 nike

我有一个枚举类...

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

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

谢谢!

最佳答案

拥有自己的属性。

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;

关于c# - 为枚举创建自定义 DisplayAttribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com