自定义属性 - 获取基础枚举的值

本文关键字:枚举 获取 自定义属性 | 更新日期: 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();
    }