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

时间:2012-04-24 18:35:16

标签: c# attributes enums

我不确定我正在尝试做什么的所有正确术语,所以我将深入研究一些代码。

当前设置

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.
    }
}

基本上 - 我想知道我是否可以在属性的构造函数中访问该属性所在的基础“事物” -

先谢谢了! 威廉

5 个答案:

答案 0 :(得分:2)

不,您无法从属性的构造函数中访问属性成员。

但是为什么要这样做,如果你已经有一个逻辑如何从枚举值中解析友好名称。

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());
    }
}

答案 1 :(得分:2)

除了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();

答案 2 :(得分:2)

属性无法(直接)访问其描述的内容。如果你想让ToString()成为默认值并且偶尔只覆盖它,你最好使用一个默认为ToString()的辅助函数(例如GetFriendlyName),但如果存在一个FriendlyName属性中的值,则将其替换。

答案 3 :(得分:1)

请尝试以下方法:

var inputString = NavigationLinks.SystemDashboard;
Regex.Replace(inputString, "([A-Z][a-z0-9]+)+", "$1$2");

答案 4 :(得分:1)

使用DescriptionAttribute(或创建自定义属性),然后使用Reflection获取值:

创建类EnumDescriptions(使用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();
    }