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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM