创建以键值为字符串的枚举

本文关键字:枚举 字符串 键值 创建 | 更新日期: 2023-09-27 18:18:17

我知道下面的语法可以使用enum,并且可以通过解析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。

创建以键值为字符串的枚举

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

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

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

现在您可以使用:

获取字符串:
Console.WriteLine(Deers[Animal.Tiger]);

如果你的鹿号是一行的(没有空格,从0开始: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的答案)。

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

public enum Anumal { Tiger=1, TIG = 1, Lion= 2, LIO=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";
}

正如DonBoitnott在评论中所说,这应该会产生编译错误。我刚试过了,确实有效果。Enum实际上是整型,因为char类型是整型的子集,所以你可以将'T'赋值给Enum,但不能将string赋值给Enum。

如果你想输出某个数字的'T'而不是Tiger,你只需要将enum强制转换为该类型。

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

((int)Animal.Tiger).ToString()

可能的替代解决方案:

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
}