Enum.ToString()遵循EnumMemberAnnotation。
Enum.ToString()遵循EnumMemberAnnotation。
我有一个使用EnumMember
注解的枚举,以便与JSON.NET序列化类似如下:
[DataContract] [JsonConverter(typeof(StringEnumConverter))] public enum Status { [EnumMember(Value = "NOT_ADMITTED")] NotAdmitted, [EnumMember(Value = "ADMITTED")] Admitted }
现在,不考虑JSON.NET序列化,我想将枚举实例转换为字符串,同时遵守数据合同中的EnumMember
注解,例如:
aStatusInstance.ToString() == "NOT_ADMITTED"
。
有什么建议吗?谢谢!
更新:我的解决方案
我修改了接受答案中的代码,创建了一个扩展方法来获取EnumMember的值:
public static string GetEnumMemberValue(this Enum enumValue) { var type = enumValue.GetType(); var info = type.GetField(enumValue.ToString()); var da = (EnumMemberAttribute[])(info.GetCustomAttributes(typeof(EnumMemberAttribute), false)); if (da.Length > 0) return da[0].Value; else return string.Empty; }
问题的出现原因是希望在使用Enum.ToString()方法时,返回的字符串与EnumMember注解的值一致。然而,Enum.ToString()方法只返回枚举字段的名称,并不考虑其他注解的值。
为了解决这个问题,可以使用Description属性来装饰枚举,并将其值与EnumMember相同。首先,需要在枚举中添加DataContract和JsonConverter注解,并为每个枚举字段添加EnumMember和Description注解,示例如下:
[DataContract] [JsonConverter(typeof(StringEnumConverter))] public enum Status { [EnumMember(Value = "NOT_ADMITTED")] [Description("NOT_ADMITTED")] NotAdmitted, [EnumMember(Value = "ADMITTED")] [Description("ADMITTED")] Admitted }
然后,可以编写一个扩展方法,将其作为Enum类的扩展方法,用于获取枚举字段的描述。该方法通过反射获取字段的Description属性,并返回其值。示例如下:
public static string GetDescription(this Enum enumValue) { Type type = enumValue.GetType(); FieldInfo info = type.GetField(enumValue.ToString()); DescriptionAttribute[] da = (DescriptionAttribute[])(info.GetCustomAttributes(typeof(DescriptionAttribute), false)); if (da.Length > 0) return da[0].Description; else return string.Empty; }
最后,可以使用扩展方法来比较枚举字段的描述与指定的值是否相等。示例如下:
aStatusInstance.GetDescription() == "NOT_ADMITTED"
通过这种方式,可以在使用Enum.ToString()方法时,返回EnumMember注解的值,并与指定的值进行比较,从而解决了原问题。