7

我知道枚举可以使用以下语法,并且可以通过将其解析为 int 或 char 来获取值。

public enum Animal { Tiger=1, Lion=2 }
public enum Animal { Tiger='T', Lion='L' }

虽然下面的语法也是对的

public enum Anumal { Tiger="TIG", Lion="LIO"}

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

4

6 回答 6

8

您不能在枚举中使用字符串。改为使用一个或多个字典:

Dictionary<Animal, String> Deers = new Dictionary<Animal, String>
{
    { Animal.Tiger, "TIG" },
    { ... }
};

现在您可以使用以下方法获取字符串:

Console.WriteLine(Deers[Animal.Tiger]);

如果你的鹿数是一致的(没有间隙并且从零开始:0、1、2、3,....)你也可以使用一个数组:

String[] Deers = new String[] { "TIG", "LIO" };

并以这种方式使用它:

Console.WriteLine(Deers[(int)Animal.Tiger]);

扩展方法

如果你不想每次都写上面的代码,你也可以使用扩展方法:

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

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

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

并以这种方式使用它:

Animal myAnimal = Animal.Tiger;
Console.WriteLine(myAnimal.AsString());

其他可能性

也可以通过使用反射来做空洞的事情,但这取决于你的表现应该如何(见 aiapatag 的回答)。

于 2013-06-13T11:12:49.200 回答
8

如果你真的坚持使用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();
    }

然后通过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();
    }
}

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

于 2013-06-13T11:18:06.940 回答
2

这是不可能的,枚举的值必须映射到数字数据类型。(char实际上是一个数字,它被写成一个字母)但是一种解决方案可能是使用具有相同值的别名,例如:

public enum Anumal { Tiger=1, TIG = 1, Lion= 2, LIO=2}

希望这可以帮助!

于 2013-06-13T11:14:35.110 回答
2

枚举是不可能的。http://msdn.microsoft.com/de-de/library/sbbt4032(v=vs.80).aspx 您只能解析 INT 值。

我会推荐静态成员:

public class Animal 
{
    public static string Tiger="TIG";
    public static string Lion="LIO";
}

我认为它更容易处理。

于 2013-06-13T11:15:12.827 回答
1

正如 DonBoitnott 在评论中所说,这应该会产生编译错误。我刚试过,它确实产生了。Enum 实际上是 int 类型,并且由于 char 类型是 int 的子集,因此您可以将 'T' 分配给 enum,但不能将 string 分配给 enum。

如果您想打印某个数字的“T”而不是 Tiger,您只需要将 enum 转换为该类型。

((char)Animal.Tiger).ToString()

或者

((int)Animal.Tiger).ToString()
于 2013-06-13T11:17:30.633 回答
0

可能的替代解决方案:

public enum SexCode : byte { Male = 77, Female = 70 } // ascii values

之后,您可以在课堂上应用此策略

class contact {
    public SexCode sex {get; set;} // selected from enum
    public string sexST { get {((char)sex).ToString();}} // used in code
}
于 2021-02-24T16:50:53.163 回答