自定义属性 - 获取基础枚举的值
本文关键字:枚举 获取 自定义属性 | 更新日期: 2023-09-27 18:32:11
我不确定我想要做什么的所有正确术语,所以我将深入研究一些代码。
当前设置:
public enum NavigationLinks
{
[FriendlyName("System Dashboard")]
SystemDashboard,
[FriendlyName("Trading Dashboard")]
TradingDashboard,
}
public class UINameAttribute : Attribute
{
public string Value { get; private set; }
public UINameAttribute(string Value)
{
this.Value = Value;
}
}
我想要什么:
public enum NavigationLinks
{
[FriendlyName]
SystemDashboard,
[FriendlyName]
TradingDashboard,
}
public class UINameAttribute : Attribute
{
public string Value { get; private set; }
public UINameAttribute(string Value)
{
this.Value = Value;
}
public UINameAttribute()
{
string AttributedValue = this.AttributedObject.ToString();
// Take the value of the attribute and add a space in between the camel case.
}
}
我可以从属性的构造函数中访问属性所在的底层"事物"吗?
不可以,不能从属性的构造函数中访问特性化成员。
但是,如果您已经有一个逻辑如何从枚举值解析友好名称,为什么要这样做。
public enum NavigationLinks
{
SystemDashboard,
TradingDashboard,
}
public static class Program
{
private static string ToFriendlyName(string defaultName)
{
var sb = new StringBuilder(defaultName);
for (int i = 1; i < sb.Length; ++i)
if (char.IsUpper(sb[i]))
{
sb.Insert(i, ' ');
++i;
}
return sb.ToString();
}
public static void Main(string[] args)
{
var value = NavigationLinks.SystemDashboard;
var friendlyName = ToFriendlyName(value.ToString());
}
}
除了 Stipo 的方法之外,您还可以编写一个扩展方法来获取名称,如下所示:
public static class NavigationLinksExtension
{
public static string GetFriendlyName(this NavigationLinks navLink)
{
string tmpName = navLink.ToString();
tmpName = Regex.Replace(tmpName, "(?<=[a-z])([A-Z])", " $1"); // insert space
return tmpName;
}
}
然后,您可以简单地访问该值:
NavigationLinks nl = NavigationLinks.TradingDashboard;
string nlFriendlyName = nl.GetFriendlyName();
属性
不能(直接)访问它所描述的内容。 如果您希望 ToString() 成为默认值并且只是偶尔覆盖它,则最好使用一个默认为 ToString() 的帮助函数(例如 GetFriendlyName),但如果存在的话,请将其替换为 FriendlyName 属性中的值。
请尝试以下操作:
var inputString = NavigationLinks.SystemDashboard;
Regex.Replace(inputString, "([A-Z][a-z0-9]+)+", "$1$2");
使用 DescriptionAttribute(或创建自定义属性),然后使用 Reflection 获取值:
创建类枚举描述(使用 System.ComponentModel 和 System.Reflection):
public class EnumDescriptions
{
public static string StringValueOf(Enum value)
{
FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes[0].Description;
}
并将描述放在枚举中:
public enum Animals
{
[Description("System Dashboard")]
SystemDashboard,
[Description("Trading Dashboard")]
TradingDashboard,
}
要获取值,请执行以下操作:
static void Main(string[] args)
{
Console.WriteLine(EnumDescriptions.StringValueOf(Animals.SystemDashboard));
Console.WriteLine();
Console.WriteLine(EnumDescriptions.StringValueOf(Animals.TradingDashboard));
Console.Read();
}