创建具有键值的枚举作为字符串

Sha*_*ham 5 c# enums

我知道enum可以使用以下语法,并且可以通过在int或char中解析它来获取值.

public enum Animal { Tiger=1, Lion=2 }
public enum Animal { Tiger='T', Lion='L' }
Run Code Online (Sandbox Code Playgroud)

虽然以下语法也是对的

public enum Anumal { Tiger="TIG", Lion="LIO"}
Run Code Online (Sandbox Code Playgroud)

在这种情况下如何获得价值?如果我使用它转换它ToString(),我得到的KEY不是VALUE.

Fel*_* K. 8

您不能在枚举中使用字符串.使用一个或多个词典istead:

Dictionary<Animal, String> Deers = new Dictionary<Animal, String>
{
    { Animal.Tiger, "TIG" },
    { ... }
};
Run Code Online (Sandbox Code Playgroud)

现在您可以使用以下命令获取字符串:

Console.WriteLine(Deers[Animal.Tiger]);
Run Code Online (Sandbox Code Playgroud)

如果您的鹿数在线(无间隙并从零开始:0,1,2,3 ......),您还可以使用数组:

String[] Deers = new String[] { "TIG", "LIO" };
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

Console.WriteLine(Deers[(int)Animal.Tiger]);
Run Code Online (Sandbox Code Playgroud)

扩展方法

如果您不希望每次都在每次上面编写代码,您也可以使用扩展方法:

public static String AsString(this Animal value) => Deers.TryGetValue(value, out Animal result) ? result : null;
Run Code Online (Sandbox Code Playgroud)

或者如果你使用一个简单的数组

public static String AsString(this Animal value)
{
    Int32 index = (Int32)value;
    return (index > -1 && index < Deers.Length) ? Deers[index] : null;
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

Animal myAnimal = Animal.Tiger;
Console.WriteLine(myAnimal.AsString());
Run Code Online (Sandbox Code Playgroud)

其他可能性

它也可以通过使用反射来完成这些洞,但这取决于你的表现应该如何(参见aiapatag的答案).


aia*_*tag 6

如果您确实坚持要使用enum来做到这一点,则可以通过具有Description属性并通过来获取它们Reflection

    public enum Animal
    {
        [Description("TIG")]
        Tiger,
        [Description("LIO")]
        Lion
    }

    public static string GetEnumDescription(Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes =
            (DescriptionAttribute[])fi.GetCustomAttributes(
            typeof(DescriptionAttribute),
            false);

        if (attributes != null &&
            attributes.Length > 0)
            return attributes[0].Description;
        else
            return value.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

然后通过 string description = GetEnumDescription(Animal.Tiger);

或使用扩展方法

public static class EnumExtensions
{
    public static string GetEnumDescription(this Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes =
            (DescriptionAttribute[])fi.GetCustomAttributes(
            typeof(DescriptionAttribute),
            false);

        if (attributes != null &&
            attributes.Length > 0)
            return attributes[0].Description;
        else
            return value.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用 string description = Animal.Lion.GetEnumDescription();