我们通常用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);