1

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

当前设置

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

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

提前致谢!威廉

4

5 回答 5

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());
    }
}
于 2012-04-24T18:57:32.960 回答
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();
于 2012-04-24T19:11:29.080 回答
2

属性不能(直接)访问它所描述的事物。如果您希望 ToString() 成为默认值并且只是偶尔覆盖它,则最好使用默认为 ToString() 的辅助函数(例如 GetFriendlyName),但如果存在,则将其替换为 FriendlyName 属性中的值。

于 2012-04-24T19:14:03.953 回答
1

请尝试以下方法:

var inputString = NavigationLinks.SystemDashboard;
Regex.Replace(inputString, "([A-Z][a-z0-9]+)+", "$1$2");
于 2012-04-24T19:02:58.593 回答
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();
    }
于 2012-04-24T19:17:50.517 回答