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);

 

posted @ 2018-03-30 14:30  叮*^_^*叮  阅读(1677)  评论(0编辑  收藏  举报