码迷,mamicode.com
首页 > Web开发 > 详细

.NetCore自动转换枚举类显示自定义中文名称

时间:2020-01-29 00:48:06      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:omd   返回   arguments   read   efault   class   方法   枚举类   引用   

通常我们在定义枚举类时,可能使用数字或者英文,但在界面显示的时候又希望显示中文,我总结了以下两种方法

(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

.NetCore自动转换枚举类显示自定义中文名称

标签:omd   返回   arguments   read   efault   class   方法   枚举类   引用   

原文地址:https://www.cnblogs.com/cdoneiX/p/12239424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!