我知道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。
答案 0 :(得分:7)
您无法在枚举中使用字符串。使用一个或多个词典:
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的回答)。
答案 1 :(得分:4)
如果您确实坚持使用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();
答案 2 :(得分:2)
这是不可能的,枚举的值必须映射到数字数据类型。 (char
实际上是一个以字母为单位的数字)
但是,一种解决方案可能是使用具有相同值的别名,例如:
public enum Anumal { Tiger=1, TIG = 1, Lion= 2, LIO=2}
希望这有帮助!
答案 3 :(得分:1)
Enums无法做到这一点。 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";
}
我觉得它更容易处理。
答案 4 :(得分:0)
正如DonBoitnott在评论中所说,这应该产生编译错误。我刚试过,它确实产生了。实际上,枚举是int类型,因为char类型是int的子集,所以你可以将'T'分配给枚举,但不能将字符串赋给枚举。
如果你想打印某个数字的'T'而不是Tiger,你只需要将枚举转换为该类型。
((char)Animal.Tiger).ToString()
或
((int)Animal.Tiger).ToString()
答案 5 :(得分: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
}