如何编写带#字符的enum

本文关键字:enum 字符 何编写 | 更新日期: 2023-09-27 18:08:47

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#。如何做到这一点?

我试过了:怎么用?字符,但[Description("F#")]中的Description似乎不存在。(用红线下划线,如果我右键单击它,它甚至没有显示任何"Resolve"。

更新:澄清:

    这不是一个副本。因为duplicate answer不是enum,而是一个被配置为enum的类。我想要enum解决方案。
  1. 如果不可能,那么请回答"it's not possible",而不是标记为重复。
  2. 在我发表这篇文章之前我已经读过了。

谢谢。

如何编写带#字符的enum

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

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

然后使用Thomas的回答从这个线程,这样做:

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

对于你的enum:

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

DescriptionAttribute是System.ComponentModel的一部分。

如果要将文本与enum关联,可以通过using System.ComponentModel;

你可以使用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();
        }
    }