在各種開發項目中使用公用類庫的擴展方法,通過上下文方式快速調用處理函數

不管我們開發是基於Asp.net core 還是.net core,或者還是.net framework的相關應用,如果有一個比較全面的公用類庫以及相關的擴展函數來支撐,我們開發項目上會節省很多相關的處理方法查詢和封裝。本篇隨筆主要針對性的介紹基於一些對象進行擴展函數的封裝帶來的便利性進行說明,畢竟基於上下文的調用擴展函數,比不斷地去自己去類庫中查找那個方法合適,會更高效一些。

1、針對常規對象進行擴展函數的封裝

我們常常使用到的對象,可能包括有字符串(String)、日期對象(DateTime)、列表集合(List/IEnumerable)、常規對象Object、UI控件(如普通的Control對象處理,其他常規控件對象等),一般來說,這些常規類型的對象我們會在代碼中應用很多,對於上下文的一些快速的調用可以快速減少我們翻查代碼的時間,隨着時間的累積,我們會使用的更加快捷和熟悉。

字符串可能是我們日常使用C#代碼,操作最多的一個.net 基礎類型了,一般字符串涉及到格式判斷、格式轉換、內容截取、正則表達式處理、編碼處理等等,幾乎是五花八門。

我們一般為了方便,都會給字符串類型編寫一些擴展函數,以便於常規的處理。編寫擴展字符串函數的處理也很簡單,創建一個靜態類,並在方法中第一個方法參數指定為this即可,如下所示。

 我們可以編寫很多用於常規處理的字符串函數,如格式轉換和內容提取,以及正則表達式等。

 字符串的格式轉換是非常常見的處理,如對UrlEncode/HtmlEncode/Base64轉換/byte[]位元組轉換等等,一般我們可以把常見的放在一個靜態類裏面,這樣便於維護。

日期類型也是我們常見的,因此可以針對日期的格式轉換、日期的處理等內容整合到一個擴展函數裏面,便於快速的調用和維護。

針對常規的C#對象的擴展,我們編寫、收集整理了不少擴展函數,主要就是提高開發的便利性。如下截圖所示。

 有時候,我們在開發常規Windows項目的時候,需要用到對常規控件的賦值、數據綁定等常規處理,我們也可以通過編寫擴展函數,並重載不同的方法,來更加的方便調用擴展函數的代碼處理。

 

而對於第三方的UI控件,如DevExpress的一些控件,如果處理的時候,也進行一些控制封裝,會使得調用代碼更加簡潔的,如下是針對一些常規DevExpress控件的擴展函數封裝。

  

2、擴展函數的調用及便利

這些不同類型的控件擴展函數的封裝,使得我們操作對象的處理更加便捷,如字符串轉換為int類型的時候,我們直接調用擴展函數轉換即可。

        /// <summary>
        /// 獲取表的所有記錄數量
        /// </summary>
        /// <returns></returns>
        public int GetRecordCount()
        {
            var action = "GetRecordCount";
            string url = GetTokenUrl(action);

            return JsonHelper<DataTable>.ConvertString(url).ToInt32();
        }

還有我們在開發界面的時候,更加方便調用來進行數據處理。如常規的對TreeList控件的處理代碼,需要添加列和屬性的時候,代碼如下。

        /// <summary>
        /// 初始化樹控件
        /// </summary>
        private void InitTree()
        {
            this.tree.Columns.Clear();//添加顯示列
            this.tree.Columns.Add(new TreeListColumn { FieldName = "Id", Caption = "Id" });//增加一個隱藏的字段,存儲需要的ID
            this.tree.Columns.Add(new TreeListColumn { FieldName = "Name", Caption = "菜單名稱", Width = 160, VisibleIndex = 0 });
            //設置樹控件的層次關係及屬性
            tree.KeyFieldName = "Id";
            tree.ParentFieldName = "PID";
            this.tree.OptionsBehavior.Editable = false;
            this.tree.OptionsView.EnableAppearanceOddRow = true;
            this.tree.OptionsView.EnableAppearanceEvenRow = true;
            this.tree.OptionsDragAndDrop.DragNodesMode = DragNodesMode.None;//不允許拖動

而使用擴展函數的時候,可以簡化它的調用方式,並比較直觀的處理。

       /// <summary>
        /// 初始化樹控件
        /// </summary>
        private void InitTree()
        {
            this.tree.Columns.Clear();
            this.tree.OptionsDragAndDrop.DragNodesMode = DragNodesMode.None;//不允許拖動

            //控件擴展函數封裝處理
            this.tree.CreateColumn("Name", "菜單名稱", 160, true);
            this.tree.InitTree("Id", "PID", null, false, false);

詳細了解這個處理,可以參考隨筆《在Winform開發框架中使用DevExpress的TreeList和TreeListLookupEdit控件

有時候,我們還可以結合數據庫處理,對擴展函數進行一定的封裝處理,如下代碼所示。

        /// <summary>
        /// 綁定下拉列表控件為指定的數據字典列表
        /// </summary>
        /// <param name="combo">下拉列表控件</param>
        /// <param name="dictTypeName">數據字典類型名稱</param>
        /// <param name="defaultValue">控件默認值</param>
        public static void BindDictItems(this ComboBoxEdit combo, string dictTypeName, string defaultValue)
        {            
            Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
            List<CListItem> itemList = new List<CListItem>();
            foreach (string key in dict.Keys)
            {
                itemList.Add(new CListItem(key, dict[key]));
            }

            BindDictItems(combo, itemList, defaultValue);            
        }

用的時候,就非常簡單了,如下代碼是實際項目中對字典列表綁定的操作,字典數據在字典模塊裏面統一定義的。

/// <summary>
/// 初始化數據字典
/// </summary>
private void InitDictItem()
{
    txtInDiagnosis.BindDictItems("入院診斷");
    txtLeaveDiagnosis.BindDictItems("最後診斷");

    //初始化代碼
    this.txtFollowType.BindDictItems("隨訪方式");
    this.txtFollowStatus.BindDictItems("隨訪狀態");
}

這樣就非常簡化了我們對字典數據源的綁定操作了,非常方便易讀,下面是其中一個功能界面的下拉列表展示。

 

擴展函數的功能主要即使便於我們對一些常規類型的對象進行快速的操作,因此積累豐富的擴展類庫,可以提高我們的開發能力,同時也可以給我們提供很好的參考,有時候可以把一些新的內容加入到已有的擴展函數中去,隨着逐漸對對象的處理函數更加熟悉,我們就會更加嫻熟的使用它們。