• C# 状态数据的显示和存储


        我们通常用int类型将订单状态存储到数据库中,但对于状态的显示我们需要真实的状态名称。可以解决的办法有:

    1.在数据库增加一个状态名称字段,显然不是好办法。

    2.每次查询数据的时候增加一个查询字段 when orderstatus case 1 then ‘待支付’ case 2 then '待发货'......  。这是很繁琐的解决方案,假如状态要增加,在数据库存储过程上改一通,在程序里也要改一通。

    3.很多人会想到用枚举类的字段属性来设置状态对应的显示名称,这样真的能解决状态名称显示的所有场景吗?假如状态类型不是int型是string型(例如权限管理中view、delete、edit......),假如程序接口返回datatable,绑定列表显示

    以上都不是我想要的方案,我们从使用意义出发,状态是从程序到数据库储存,从数据库到程序中得到显示。那我们应该实现只用程序来定义状态,做到程序与数据库分离。于是我想到了一下解决办法。

    一、首先写一个抽象类,实现所有状态类型的通用方法

        public abstract class Type<T, U>
        {
            protected abstract Dictionary<T, U> Data { get; }
    
            public Dictionary<T, U> Get()
            {
                return Data;
            }
    
            public U GetValue(T key)
            {
                return Data[key];
            }
    
            public T GetKey(U value)
            {
                return Data.First(a => a.Value.Equals(value)).Key;
            }
    
            public DataTable SetDataTable(DataTable dt, string columnName)
            {
                string typeName = columnName + "_name";
                dt.Columns.Add(typeName, typeof(string));
                foreach (DataRow row in dt.Rows)
                {
                    T key = (T)Convert.ChangeType(row[columnName], typeof(T));
                    row[typeName] = GetValue(key);
                }
                return dt;
            }
        }

    二、管理权限操作类型的示例类

    public class ActionType : Type<string, string>
        {
            public const string Show = "Show";
            public const string View = "View";
            public const string Add = "Add";
            public const string Edit = "Edit";
            public const string Delete = "Delete";
            public const string Enable = "Enable";
            public const string Audit = "Audit";
            public const string Own = "Own";
            public const string Login = "Login";
            public const string Register = "Register";
    
            protected override Dictionary<string, string> Data
            {
                get
                {
                    return new Dictionary<string, string>
                    {
                        {Show, "显示"},
                        {View, "查看"},
                        {Add, "添加"},
                        {Edit, "修改"},
                        {Delete, "删除"},
                        {Enable, "启用"},
                        {Audit, "审核"},
                        {Own, "只能操作自己发布的"},
                        {Login, "登录"},
                        {Register,"注册" }
                    };
                }
            }
    
            public static ActionType type
            {
                get
                {
                    return new ActionType();
                }
            }
        }

    三、使用方法

    DataTable dt = ActionType.type.SetDataTable(GetActionTable(),"actiontype");
    
    bool flag = IsLevel(ActionType.Audit);
  • 相关阅读:
    【http】HTTP请求方法 之 OPTIONS
    【javascript基础】函数前面的一元操作符
    【javascript基础】运算符优先级
    【移动互联网开发】Zepto 使用中的一些注意点 【转】
    【jQuery】IE9 jQuery 1.9.1 报 Syntax error,unrecognized expression 错误
    一月收集几个有用的谷歌Chrome插件
    【Sizzle学习】之关于【初探 jQuery 的 Sizzle 选择器】这篇文章里的小bug
    【第三方类库】underscore.js源码---each forEach 每次迭代跟{}比较的疑惑
    vue-cli脚手架npm相关文件解读(2)webpack.prod.conf.js
    vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js
  • 原文地址:https://www.cnblogs.com/ding2011/p/8676007.html
Copyright © 2020-2023  润新知