通常我们在定义枚举类时,可能使用数字或者英文,但在界面显示的时候又希望显示中文,我总结了以下两种方法
(1)显示自定义的枚举名称:
public enum WorkFlowProcessState { [Display(Name = "未启动")] None = 0, [Display(Name = "等待中")] Waiting, [Display(Name = "处理中")] Processing, [Display(Name = "已通过")] Passed, [Display(Name = "未通过")] UnPassed, [Display(Name = "已禁用")] Disabled, [Display(Name = "已撤销")] Canceled }
我使用Newtonsoft.Json提供的JsonConverter方法,以实现WebAPI在返回Json时对枚举类进行自动转换。 新增如下转换器方法:
public class JsonEnumDisplayConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { try { var t = value.GetType().GetFields().SingleOrDefault(w => w.Name == value.ToString()).CustomAttributes.SingleOrDefault(w => w.AttributeType == typeof(DisplayAttribute)); if (t != null) { writer.WriteValue(t.NamedArguments[0].TypedValue.Value.ToString()); } else { writer.WriteValue(value.ToString()); } } catch { writer.WriteValue(""); } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); } public override bool CanRead => false; public override bool CanConvert(Type objectType) { return objectType == typeof(string); } }
在模型类(或视图模型类)中定义:
[Display(Name = "审批状态"),JsonConverter(typeof(JsonEnumDisplayConverter))] public WorkFlowProcessState PROCESS_STATE { get; set; }
注意JsonConverter(typeof(JsonCustomDateTimeConverter))这个属性标签,就是告诉框架如何转换。
(2)从数据库中存储的枚举int值转换为枚举名称:
Newtonsoft.Json库默认提供了一个转换器,叫StringEnumConverter,使用方法和上面类似,只不过写成JsonConverter(typeof(StringEnumConverter)),效果是会显示定义的枚举,例如None、Waiting……如果你直接以中文定义枚举值,也可以和方法一达到一样的效果。
注意以上方法需引用包Newtonsoft.Json
原文地址:https://www.cnblogs.com/cdoneiX/p/12239424.html
时间: 2024-10-29 10:00:35