zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    layui 获取select下拉选项上自定义的属性
    TP中关联模型的使用
    安卓模仿直播中的闪动(放大缩小)的动画
    Android报错Multiple dex files define Lcom/ta/utdid2/c/a/c
    Date.parse()的坑
    Android应用加固的简单实现方案(二)
    Android应用加固的简单实现方案
    Android中ANR的触发机制-BroadcastReceiver篇
    Android中ANR的触发机制-Service篇
    Application中以标准模式启动Activity报错的原因分析
  • 原文地址:https://www.cnblogs.com/ding2011/p/8676007.html
Copyright © 2011-2022 走看看