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