亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# TextBox 擴展方法數據驗證詳細說明

2020-01-24 03:32:41
字體:
來源:轉載
供稿:網友

      查看公司項目代碼時,存在這樣一個問題:winform界面上有很多信息填寫,提交后臺服務器更新,但數據的合法驗證及值的轉換卻不太敢恭維,一堆的if判斷和轉換,便想著是否能擴展個方法出來,琢磨出個思路,記錄下來與大家共同探討,有不對的地方還請大家指正。

      設計思路:
    1. 由于大部分從TextBox控件中獲取數據值,可以擴展個泛型方法出來,直接根據轉換后的數據類型獲得值,類似這樣,
      var value = this.txtSample.GetValue<int>();

    2. 可以傳入一個委托用來處理轉換失敗的操作,并重載此方法,提供一個默認的操作。

  好,下面開工:
    1. 創建TextBox類型的擴展方法
      引用MSDN的解釋:擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對于用 C# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。
      擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用于哪個類型,并且該參數以 this 修飾符為前綴。 僅當您使用 using 指令將命名空間顯式導入到源代碼中之后,擴展方法才位于范圍中。
      注意:擴展方法是在非嵌套、非泛型靜態類內部定義的

    2. 由于轉換類型未知,但為值類型,故采用泛型方法設計,并加上strut泛型約束,由于允許自定義處理轉換失敗時的操作,故傳入一個Action委托來實現,如下:

復制代碼 代碼如下:

public static TResult GetValue<TResult>(this TextBox textBox, Action<TextBox> failed)
            where TResult : struct
        {
            var type = typeof(TResult);
            var method = type.GetMethod("TryParse", new Type[] { typeof(string), type.MakeByRefType() });
            var parameters = new object[] { textBox.Text, default(TResult) };

            // 若轉換失敗,執行failed
            if (!(bool)method.Invoke(null, parameters))
            {
                failed(textBox);
                throw new InvalidCastException("輸入值格式不正確,請檢查輸入值。");
            }

            return (TResult)parameters[1];
        }

       這里采用反射機制來調用類型的T.TryParse(string param, out T value),例如Int32.TryParse(string param,out Int32 value)等,需要注意的是:
       (1). GetMethod()方法,必須傳入合適的參數(要反射的方法的簽名)來確定方法唯一,例如碰到重載這種情況(比較常見),否則返回值為null,方法的簽名中,若參數帶有ref 或out 關鍵字,則Type類型需要加上.MakeByRefType(),如上。
       (2). 得到唯一的方法實例后,可以傳入相應的參數,調用Invoke方法來實現方法的調用,MethodInfo.Invoke(object obj, object[] parameters)方法第一個參數為反射調用該方法的對象,如果為靜態方法(比如本例),可以傳入null,第二個參數為方法的參數,順序必須與方法簽名一致。
       (3). 方法參數中帶有ref和out關鍵字,獲得該值通過參數數組來獲得。如本例中:parameters[1]

    3. 定義轉換失敗操作的委托
      C#內置封裝的委托有兩種,Action和Func委托,并有很多的重載版本,參數可以有十多個,所以不用擔心參數問題。其中Action委托無返回值,屬于Void類型,Func委托具有返回值,如Func<T,TResult>,在Linq操作中比較常見,在該例中,無返回值的必要,故采用Action委托,由于需要處理轉換失敗的操作,故將TextBox作為該委托的參數里進行處理,如代碼所示,當轉換失敗時進行處理:   
                    // 若轉換失敗,執行failed
                    if (!(bool)method.Invoke(null, parameters))
                          failed(textBox);
      在此簡單介紹下委托:委托其實是一個類型,通過反編譯工具可以看出來,當構造委托時傳入一個方法,其實會隱形的傳入兩個參數(target,methodPtr),target參數為調用該方法的實例,若靜態方法,則為null,methodPtr為傳入方法的內存地址(在元數據中存貯該信息),faild(textBox)表面看不太好理解,為什么一個對象后面帶一個參數,其實C#編譯器為我們做了很多工作,在這里實質為faild.Invoke(textBox),這樣看還好理解委托是個類型,通過faild的委托對象來調用該委托所注冊的方法。

    4. 創建重載版本:
      用lambda表達式定義默認的轉換失敗操作,如果轉換失敗,則提示信息,并全部選中和定位到該輸入框上。

復制代碼 代碼如下:

public static TResult GetValue<TResult>(this TextBox textBox, bool isShowError)
            where TResult : struct
        {
            return GetValue<TResult>(textBox, p =>
            {
                if (isShowError)
                {
                    p.Focus();
                    p.SelectAll();
                    MessageBox.Show("輸入值格式不正確,請重新輸入!",
                        "提示--值類型:" + typeof(TResult).Name,
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            });
        }

復制代碼 代碼如下:

///默認版本,調用上個重載方法

public static TResult GetValue<TResult>(this TextBox textBox)
            where TResult : struct
        {
            return GetValue<TResult>(textBox, true);
        }

5. 實驗測試:
      新建winform程序,界面如圖所示:

后臺代碼:

復制代碼 代碼如下:

private void btnConvert_Click(object sender, EventArgs e)
        {
            try
            {
                var intValue = txtInt.GetValue<int>();
                var floatValue = txtFloat.GetValue<float>();
                var dateTimeValue = txtDateTime.GetValue<DateTime>();
                var doubleValue = txtDouble.GetValue<double>();
            }
            catch (Exception) { }
        }

如果輸入值非法,則提示錯誤,如圖所示:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩精品在线观看| 97国产精品人人爽人人做| 久久久久久噜噜噜久久久精品| 欧美精品久久一区二区| 久久av在线播放| 中文字幕免费国产精品| 日韩欧美aⅴ综合网站发布| 伊人伊成久久人综合网站| 欧美激情一区二区久久久| 91精品国产综合久久香蕉最新版| 91tv亚洲精品香蕉国产一区7ujn| 在线观看国产欧美| 伊人久久久久久久久久久| 欧美激情极品视频| 午夜免费久久久久| 亚洲国产精品大全| 超碰91人人草人人干| 日韩一区二区三区xxxx| 国产精品美女www爽爽爽视频| 97超级碰在线看视频免费在线看| 国产偷国产偷亚洲清高网站| 深夜福利一区二区| 亚洲美女av黄| 国产精品日韩欧美综合| 中文字幕日韩视频| 亚洲精品日韩欧美| 国产精品入口福利| 欧美国产日韩中文字幕在线| 91精品在线观看视频| 日韩精品极品在线观看播放免费视频| 亚洲国产日韩一区| 国产丝袜高跟一区| 亚洲精品一区在线观看香蕉| 久久久久久久久综合| 一区二区三区视频在线| 亚洲国产精品成人精品| 欧美成人精品影院| 国产视频丨精品|在线观看| 欧美裸体xxxx极品少妇软件| 日本sm极度另类视频| 91手机视频在线观看| 欧美肥婆姓交大片| 亚洲天堂av在线免费| 欧美精品videosex性欧美| 国产欧美一区二区三区在线| 欧美日韩亚洲一区二区| 奇米影视亚洲狠狠色| 欧美激情精品久久久久| 懂色av一区二区三区| 亚洲欧美一区二区三区久久| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲成人性视频| 91亚洲国产成人久久精品网站| 隔壁老王国产在线精品| 亚洲第一福利视频| 久久99精品久久久久久噜噜| 国产精品高清在线观看| 91日韩在线播放| 亚洲国产第一页| 91人人爽人人爽人人精88v| 精品高清一区二区三区| 成人免费在线视频网站| 欧美日韩性视频| 九九视频这里只有精品| 亚洲人a成www在线影院| 成人福利视频网| 91久久久国产精品| 欧美在线激情视频| 亚洲三级免费看| 成人黄色av免费在线观看| 疯狂蹂躏欧美一区二区精品| 日本最新高清不卡中文字幕| 久久精品91久久久久久再现| 亚洲综合在线小说| 国产中文字幕亚洲| 狠狠色噜噜狠狠狠狠97| 日韩中文字幕久久| 91免费人成网站在线观看18| 亚洲精品第一国产综合精品| 97精品国产97久久久久久| 国产精品一区二区电影| 91国内揄拍国内精品对白| 久久久免费精品视频| 亚洲欧美日韩国产中文| 亚洲第一男人天堂| 亚洲美女中文字幕| 欧美精品www在线观看| 91精品国产色综合久久不卡98口| 欧美成人中文字幕在线| 国产91精品在线播放| 国产网站欧美日韩免费精品在线观看| 日韩av在线最新| 91国产中文字幕| 精品成人69xx.xyz| 国产91精品久| 黑人巨大精品欧美一区二区三区| 91国产精品电影| 久久全球大尺度高清视频| 亚洲自拍中文字幕| 欧美日韩一区二区免费视频| 色婷婷久久一区二区| 日韩免费视频在线观看| 国产精品无av码在线观看| 成人午夜在线影院| 亚洲美女精品成人在线视频| 久久精品国产成人精品| 日韩国产精品视频| 成人国产精品久久久| 久久99精品久久久久久琪琪| 91高清视频免费| 精品福利在线视频| 欧美一区二区视频97| 亚洲国产精品电影| 亚洲综合色激情五月| 久久久久久久久久久人体| 国产精品88a∨| 国产精品久久久久久久久男| 亚洲电影第1页| 中文字幕日韩在线播放| 成人午夜激情免费视频| 色婷婷综合成人av| 亚洲片av在线| 久久这里有精品| 最近2019中文免费高清视频观看www99| 欧洲中文字幕国产精品| 久久久久久久久久久免费| 黑人巨大精品欧美一区二区| 亚洲天堂成人在线视频| 亚洲一区二区黄| 免费不卡在线观看av| 国产精自产拍久久久久久| 激情懂色av一区av二区av| 日韩国产欧美区| 久久久久久久久久久久av| 精品亚洲一区二区三区四区五区| 成人午夜激情免费视频| 日韩大片免费观看视频播放| 狠狠爱在线视频一区| 久久男人av资源网站| 日韩成人激情影院| 国产91色在线播放| 国产欧美日韩专区发布| 色婷婷**av毛片一区| 精品在线观看国产| 久久全球大尺度高清视频| 日本高清视频精品| 国产精品成人aaaaa网站| 亚洲午夜色婷婷在线| 欧美激情精品久久久久久久变态| 中文字幕在线看视频国产欧美在线看完整| 欧美激情一级欧美精品| 亚洲国产精品人人爽夜夜爽| 高清欧美电影在线| 日本伊人精品一区二区三区介绍| 亚州成人av在线| 国产午夜精品美女视频明星a级| www高清在线视频日韩欧美| 亚洲欧美日韩国产中文专区| 一区二区三区回区在观看免费视频| 38少妇精品导航| 中文字幕在线日韩| 97色在线视频| 在线观看国产精品91| 综合136福利视频在线|