如何用#字符编写枚举?

时间:2014-06-15 17:49:05

标签: c# enums portable-class-library

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace NumberedMusicScores
{
    public enum KeySignatures
    {
        C,
        G,
        D,
        A,
        E,
        B,
        FCress,
        CCress,
        F,
        Bb,
        Eb,
        Ab,
        Db,
        Gb,
        Cb
    }
}

如果我使用它,我希望FCressCCress显示为F#和C#。怎么做到这一点?

我试过这个:How to use ? character in an enum,但Description中的[Description("F#")]似乎不存在。 (用红线加下划线,如果我右键单击它,它甚至不显示任何“Resolve”。

更新:澄清:

  1. 这不是重复的。由于重复答案不是enum,而是配置为enum的类。我想要enum解决方案。
  2. 如果不可能,请回答“这是不可能的”,而不是将其标记为重复。
  3. 在我发布此帖之前,我已经阅读过它们了。
  4. 谢谢。

3 个答案:

答案 0 :(得分:8)

PCL框架不允许Description属性。您可以创建该属性的简化版本。

public class MyDescription : Attribute
{        
    public string Description = { get; private set; }

    public MyDescription(string description)
    {
       Description = description;
    }
}

然后使用Thomas this thread的答案,执行此操作:

public static string GetDescription(this Enum value)
{
    Type type = value.GetType();
    string name = Enum.GetName(type, value);
    if (name != null)
    {
        FieldInfo field = type.GetField(name);
        if (field != null)
        {
            MyDescription attr = 
                   Attribute.GetCustomAttribute(field, 
                     typeof(MyDescription)) as MyDescription;
            if (attr != null)
            {
                return attr.Description;
            }
        }
    }
    return null;
}

对于你的枚举:

public enum KeySignatures
{
    //...
    [MyDescription("F#")]
    FCress,
    [MyDescription("C#")]
    CCress,
    //...
}

答案 1 :(得分:1)

DescriptionAttribute是System.ComponentModel的一部分。

因此,如果您想将文本与枚举相关联,可以通过using System.ComponentModel;

执行此操作

答案 2 :(得分:0)

您可以使用System.ComponentModel.DescriptionAttribute指定您的Enum的描述,如下所示:

public enum KeySignatures
    {
        C,
        G,
        D,
        [Description("F#")]
        FCress,
        [Description("C#")]
        CCress,
        //...
    }

然后为Enum添加方法Description,如下:

public static class Util
    {
        public static string Description(this Enum value)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name != null)
            {
                FieldInfo field = type.GetField(name);
                if (field != null)
                {
                    DescriptionAttribute attr =
                        Attribute.GetCustomAttribute(field,
                            typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (attr != null)
                    {
                        return attr.Description;
                    }
                }
            }
            return value.ToString();
        }
    }