zoukankan      html  css  js  c++  java
  • .NetCore自动转换枚举类显示自定义中文名称

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

    (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.BaseType == typeof(System.Enum); } }

    在模型类(或视图模型类)中定义:

            [Display(Name = "审批状态"),JsonConverter(typeof(JsonEnumDisplayConverter))]
            public WorkFlowProcessState PROCESS_STATE { get; set; }

    注意JsonConverter(typeof(JsonCustomDateTimeConverter))这个属性标签,就是告诉框架如何转换。

    (2)从数据库中存储的枚举int值转换为枚举名称:

    Newtonsoft.Json库默认提供了一个转换器,叫StringEnumConverter,使用方法和上面类似,只不过写成JsonConverter(typeof(StringEnumConverter)),效果是会显示定义的枚举,例如None、Waiting……如果你直接以中文定义枚举值,也可以和方法一达到一样的效果。

    补充说明:

    1、以上方法需引用包Newtonsoft.Json

    2、JsonConverter也可以直接使用Newtonsoft.Json提供的JsonConvert方法来使用:

    string a=JsonConvert.SerializeObject(要转换的Enum对象,new JsonEnumDisplayConverter())

    3、也可以封装一个针对枚举的扩展方法:

    public static class EnumExtensions
        {
            public static string DisplayName(this Enum value)
            {
                if (value == null)
                {
                    return null;
                }
                else
                {
                    var t = value.GetType().GetFields().SingleOrDefault(w => w.Name == value.ToString()).CustomAttributes.SingleOrDefault(w => w.AttributeType == typeof(DisplayAttribute));
                    if (t != null)
                    {
                        return t.NamedArguments[0].TypedValue.Value.ToString();
                    }
                    else
                    {
                        return value.ToString();
                    }
    
                }
            }
        }
    

     使用的时候直接 枚举对象.DisplayName()即可

  • 相关阅读:
    PowerDesigner导出word表结构
    Java
    Java
    Java
    Java
    Java
    Java
    Java
    Java
    Java
  • 原文地址:https://www.cnblogs.com/cdoneiX/p/12239424.html
Copyright © 2011-2022 走看看