有以下一个枚举类型:
public enum MyColors
{
[StringValue("red")] red,
[StringValue("blue")] blue,
[StringValue("green")] green,
[StringValue("yellow")] yellow,
[StringValue("block")] block
}
我想输出MyColors.red是“red”。
定义StringValue为一个类,继承自System.Attribute
public class StringValue : System.Attribute
{
private string _value;
public StringValue (string value)
{
_value = value;
}
public string Value {
get { return _value; }
}
}
定义静态类StringEnum
public static class StringEnum
{
public static string GetStringValue (System.Enum value)
{
string output = null;
System.Type type = value.GetType ();
System.Reflection.FieldInfo fi = type.GetField (value.ToString ());
StringValue[] attrs = fi.GetCustomAttributes (typeof(StringValue), false) as StringValue[];
if (attrs.Length > 0) {
output = attrs [0].Value;
}
return output;
}
}
使用StringEnum.GetStringValue(System.Enum value)方法调用,
写一段测试代码:
public class EmptyClass
{
static void Main(string[] args)
{
Console.WriteLine (StringEnum.GetStringValue (MyColors.red));
Console.WriteLine (StringEnum.GetStringValue (MyColors.blue));
Console.WriteLine (StringEnum.GetStringValue (MyColors.green));
Console.WriteLine (StringEnum.GetStringValue (MyColors.yellow));
Console.WriteLine (StringEnum.GetStringValue (MyColors.block));
}
}
输出结果是:
完美解决将enum类型映射到字符串上这个问题。
由于GetStringValue(System.Enum value)方法使用的是父类System.Enum,所有定义的Enum都可以同时调用这个方法,实现代码共享,不用写多个GetStringValue方法了。
补充,将GetStringValue写成静态方法,供枚举类调用
/// 获取Enum的value值
public static string GetEnumStringValue(this System.Enum value)
{
string output = null;
System.Type type = value.GetType();
System.Reflection.FieldInfo fi = type.GetField(value.ToString());
EnumStringValue[] attrs = fi.GetCustomAttributes(typeof(EnumStringValue), false) as EnumStringValue[];
if (attrs.Length > 0)
{
output = attrs[0].Value;
}
return output;
}
调用方法MyColors.red.GetEnumStringValue(),输出“red”。