如何在C#中将字符串分配给枚举而不是整数值?

时间:2012-09-13 09:16:28

标签: c# enums

我正在尝试为枚举分配一个字符串。类似下面的例子:

    enum MyEnum
    {
        frist = "First Value",
        second = "Second Value",
        third = "Third Value"
    }

所以我可以在我的代码中使用这样的东西:

MyEnum enumVar = MyEnum.first;
...
string enumValue = EnumVar.ToString();//returns "First Value"

以传统的方式,当我创建一个枚举时,ToString()将返回枚举名称而不是其值。所以这是不可取的,因为我正在寻找一种方法来分配一个字符串值,然后从一个字符串值中获取枚举。

5 个答案:

答案 0 :(得分:19)

您可以在枚举中添加Description属性。

enum MyEnum
    {
        [Description("First Value")]
        frist, 
        [Description("Second Value")]
        second, 
        [Description("Third Value")]
        third,
    }

然后有一个方法来返回你的描述。

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

然后你可以这样做:

   MyEnum enumVar = MyEnum.frist;
   string value = GetEnumDescription(enumVar);

值将保持“第一价值”

您可能会看到:Associating Strings with enums in C#

答案 1 :(得分:6)

枚举的值不能总是整数

最接近的是带有一组静态属性的静态类

static class MyValues
{
    public static readonly string First = "First Value";
    public static readonly string Second = "Second Value";
    public static readonly string Third = "Third Value";
}

答案 2 :(得分:1)

你做不到。 enum s基于整数,而不是字符串。

答案 3 :(得分:0)

枚举的已批准类型是byte,sbyte,short,ushort,int,uint,long或ulong。 所以像字符串一样,你唯一能做的就是

  

枚举MyEnum       {           第一,           第二,           第三       }

MyEnum.first.ToString();

或者喜欢使用反射并使用描述作为枚举中字段的属性。

答案 4 :(得分:0)

enum MyEnum
{
    FirstValue, //Default Value will be 0
    SecondValue, // 1
    ThirdValue // 2
}

string str1 = Enum.GetName(typeof(MyEnum), 0); //will return FirstValue
string str2 = Enum.GetName(typeof(MyEnum), MyEnum.SecondValue); //SecondValue

如果你需要一个像空格一样的完整字符串,你需要添加描述方法。 否则我建议只创建一个查找字典。

     string value = MyLookupTable.GetValue(1); // First Value
     value = MyLookupTable.GetValue(2); // Second Value
     value = MyLookupTable.GetValue(3); // Third Value

class MyLookupTable
{
    private static Dictionary<int, string> lookupValue = null;

    private MyLookupTable() {}

    public static string GetValue(int key)
    {
        if (lookupValue == null || lookupValue.Count == 0)
            AddValues();

        if (lookupValue.ContainsKey(key))
            return lookupValue[key];
        else
            return string.Empty; // throw exception
    }

    private static void AddValues()
    {
        if (lookupValue == null)
        {
            lookupValue = new Dictionary<int, string>();
            lookupValue.Add(1, "First Value");
            lookupValue.Add(2, "Second Value");
            lookupValue.Add(3, "Third Value");
        }
    }
}