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

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 に答える
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 に答える
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 に答える
1

次のことを試してください。

var inputString = NavigationLinks.SystemDashboard;
Regex.Replace(inputString, "([A-Z][a-z0-9]+)+", "$1$2");
于 2012-04-24T19:02:58.593 に答える