基于JSON.NET为Enum实现数据与界面分离

    在日常做项目过程中,一直很烦恼枚举值显示问题。当添加,修改,删除枚举值时,都要去修改界面原先的中文表述,很是麻烦。今天针对Enum做相应的扩展,并实现Newtonsoft.Json(JSON.NET)JsonConverter个性化定制,使数据与界面分离,此方法适用于依赖Json数据结构传输数据的应用开发,例如:web 开发。

1、首先,实现Localization属性标签

 [AttributeUsage(AttributeTargets.Field)]
    public class LocalizationAttribute : Attribute
    {
        public LocalizationAttribute(string showValue)
        {
            ShowValue = showValue;
        }

        public string ShowValue { get; set; }
    }

2、实现JsonConverter,将原先enum转换结果改成{Value:[int],ShowValue:[string]}

 public class EnumLocalizationConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType.IsEnum;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            try
            {
                var value = serializer.Deserialize<EnumLocalization>(reader);
                return Enum.Parse(objectType, value.Value.ToString());
            }
            catch
            {
            }

            return Enum.Parse(objectType, serializer.Deserialize(reader).ToString());
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {

            var type = value.GetType();
            var fieldName = type.GetEnumName(value);
            if (fieldName != null)
            {
                var localozation = type.GetField(fieldName).GetCustomAttribute<LocalizationAttribute>();
                serializer.Serialize(writer, new { Value = value, ShowValue = localozation.ShowValue });
            }
            else
            {
                serializer.Serialize(writer, new EnumLocalization() { Value = value, ShowValue = string.Empty });
            }
        }
    }
    public class EnumLocalization
    {
        public object Value { get; set; }
        public string ShowValue { get; set; }
    }

3、实现Enum静态扩展功能(获取标记上的文本)

    public static class EnumLocalizationExtensions
    {
        public static string ToLocalizationString(this Enum _this)
        {
            var type = _this.GetType();
            return type.GetField(_this.ToString()).GetCustomAttribute<LocalizationAttribute>().ShowValue;
        }

        public static IDictionary<int, string> GetLocalizations(this Enum _this)
        {
            var type = _this.GetType();
            var arr = type.GetEnumValues();
            Dictionary<int, string> dict = new Dictionary<int, string>();
            foreach (int i in arr)
            {
                var enumValue = Enum.Parse(type, i.ToString()) as Enum;
                dict.Add(i, enumValue.ToLocalizationString());
            }
            return dict;
        }
    }

4、使用

   public enum LogType
    {
        [Localization("登录")]
        Login = 1,
        [Localization("退出")]
        Exit = 2,
        [Localization("添加")]
        Add = 3,
        [Localization("删除")]
        Delete = 4,
        [Localization("修改")]
        Edit = 5,
        [Localization("测试")]
        Test = 6,
        [Localization("异常")]
        Exception = 7
    }
  public class Log
    {
        public int Id { get; set; }

        public UserModel User { get; set; }

        [JsonConverter(typeof(EnumLocalizationConverter))]
        public LogType Type { get; set; }

        public Guid UId { get; set; }

        public string Summary { get; set; }

        public string ClientIP { get; set; }

        public string ServerName { get; set; }

        public DateTime CreateDT { get; set; }
    }
时间: 2024-10-09 18:24:07

基于JSON.NET为Enum实现数据与界面分离的相关文章

GUI进化--数据与界面分离

http://blog.csdn.net/doon/article/details/5946862 1.何谓数据和界面分离? GUI,即Graphic User Interface,人机交换界面.连接两端:终端用户--内部逻辑.它关联到两个角色:使用者和开发者. 用户希望看到的是,一个一个的界面元素:窗口.按钮.输入框等等可视和可操作的元素:开发者希望看到的是数据,数字.字符串或者数组.表等数据结构. 传统的GUI,例如Gtk,Qt,Windows,甚至有Android等界面,基本上是把界面和数

基于MVC+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用如何使用Json实体类构建菜单数据,然后在主界面中进行使用. 菜单的界面效果如下所示,菜单分为一级菜单.二级菜单.三级菜单,他们各自

基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用如何使用Json实体类构建菜单数据,然后在主界面中进行使用. 菜单的界面效果如下所示,菜单分为一级菜单.二级菜单.三级菜单,他们各

基于json数据格式实现的简单数据库——jsonDB

已在github上建立项目:https://github.com/ThinkerCodeChina/jsonDB /** +----------------------------------------- * jsonDB 基于json数据格式构建的数据模型 +----------------------------------------- * @description 对json数据检索,删除,查询和更新 * @author 戚银(web程序员) [email protected] * @

js基于json的级联下拉框

级联下拉列表是项目中常用到的.比如省市县,比如企业性质等,做成一个js通用组件, 在静态页出来后可以直接插入,将数据和html静态页做一个解耦. 贴出来抛砖引玉吧. <html> <script type="text/javascript"> /** 基于json的级联下拉列表,支持初始化 调用eg: var comboselect = ComboSelectFactory(data, 'p1', 'p2', 'p3', 'p4'); 设定下拉列表value,t

CDIF:基于JSON的SOA软件框架

通用设备互联框架(CDIF)是一个基于web的连接框架,目前有部分开源实现存放在: GitHub - out4b/cdif: Common device interconnect framework.CDIF是一种基于JSON的SOA软件框架.CDIF为客户端app提供了与基于XML的WSDL语言和SOAP协议同等抽象能力.但简洁得多的基于JSON的实现,也非常适合用于描述微服务架构的API接口.CDIF提供了完整的服务注册和发现能力,并为所有的web服务和物联网设备,包括REST.SOAP类型

基于JSON的级联列表实现

1.采用JSON格式存储相应的数据:省份ProJSON,城市:cityJSON; var proJSON={"1":"广东省","2":"湖北省"}; var cityJSON={"1":{'020':'广州','0755':'深圳','0756':'珠海'},'2':{'027':'武汉','0710':'襄樊','0715':'赤壁'}} 2.页面加载完成后需要显示省份的下拉框,因此要读取ProJSON

基于selenium实现自动化爬取数据

基于selenium实现自动化爬取数据 如果想具体查看selenium自动化模块的更多功能请看我的博客测试分类中有介绍 selenium 概念:基于浏览器自动化的模块 自动化:可以通过代码指定一系列的行为动作,然后将其作用到浏览器中. pip install selenium selenium和爬虫之间的关联 1.便捷的捕获到任意形式动态加载的数据(可见即可得) 2.实现模拟登录 谷歌驱动下载:http://chromedriver.storage.googleapis.com/index.ht

基于 移动最小二乘法(MLS) 的三维数据拟合

项目介绍: 1. 需要预测的数据: 2. 采用的权函数以及形函数: 3. 求解的形函数曲线结果: 4. 算法流程图: 5. 预测结果: x=[234 255 255 76 12];y=[162 242 176 54 55];z=[199 200 57 50 73]; 对应的预测结果为: >> MLS_Output Esti_ux = 53.3651 73.8599 54.2216 5.9668 9.0063 Esti_uy = 43.9818 77.5332 48.3499 5.2517 11