欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# TextBox 擴(kuò)展方法數(shù)據(jù)驗(yàn)證詳細(xì)說(shuō)明

 更新時(shí)間:2013年03月17日 12:50:07   作者:  
C# TextBox 擴(kuò)展方法數(shù)據(jù)驗(yàn)證詳細(xì)說(shuō)明,需要的朋友可以參考一下

      查看公司項(xiàng)目代碼時(shí),存在這樣一個(gè)問(wèn)題:winform界面上有很多信息填寫,提交后臺(tái)服務(wù)器更新,但數(shù)據(jù)的合法驗(yàn)證及值的轉(zhuǎn)換卻不太敢恭維,一堆的if判斷和轉(zhuǎn)換,便想著是否能擴(kuò)展個(gè)方法出來(lái),琢磨出個(gè)思路,記錄下來(lái)與大家共同探討,有不對(duì)的地方還請(qǐng)大家指正。

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

    2. 可以傳入一個(gè)委托用來(lái)處理轉(zhuǎn)換失敗的操作,并重載此方法,提供一個(gè)默認(rèn)的操作。

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

    2. 由于轉(zhuǎn)換類型未知,但為值類型,故采用泛型方法設(shè)計(jì),并加上strut泛型約束,由于允許自定義處理轉(zhuǎn)換失敗時(shí)的操作,故傳入一個(gè)Action委托來(lái)實(shí)現(xiàn),如下:

復(fù)制代碼 代碼如下:

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

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

            return (TResult)parameters[1];
        }

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

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

    4. 創(chuàng)建重載版本:
      用lambda表達(dá)式定義默認(rèn)的轉(zhuǎn)換失敗操作,如果轉(zhuǎn)換失敗,則提示信息,并全部選中和定位到該輸入框上。

復(fù)制代碼 代碼如下:

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("輸入值格式不正確,請(qǐng)重新輸入!",
                        "提示--值類型:" + typeof(TResult).Name,
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            });
        }

復(fù)制代碼 代碼如下:

///默認(rèn)版本,調(diào)用上個(gè)重載方法

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

5. 實(shí)驗(yàn)測(cè)試:
      新建winform程序,界面如圖所示:

后臺(tái)代碼:

復(fù)制代碼 代碼如下:

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) { }
        }

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

相關(guān)文章

  • C#刪除Word文檔中的段落的方法示例

    C#刪除Word文檔中的段落的方法示例

    在編輯Word文檔時(shí),我們有時(shí)需要調(diào)整段落的布局、刪除不必要的段落以優(yōu)化文檔的結(jié)構(gòu)和閱讀體驗(yàn),本文將通過(guò)以下3個(gè)簡(jiǎn)單示例演示如何使用免費(fèi).NET庫(kù)刪除Word文檔中的段落 ,需要的朋友可以參考下
    2024-09-09
  • c#之關(guān)閉窗體的實(shí)現(xiàn)方法

    c#之關(guān)閉窗體的實(shí)現(xiàn)方法

    這篇文章主要介紹了c#之關(guān)閉窗體的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C#中的多線程小試牛刀

    C#中的多線程小試牛刀

    這篇文章主要給大家介紹了關(guān)于C#中多線程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • DevExpress實(shí)現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法

    DevExpress實(shí)現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法

    這篇文章主要介紹了DevExpress實(shí)現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法,需要的朋友可以參考下
    2014-08-08
  • C#自定義WPF中Slider的Autotooltip模板

    C#自定義WPF中Slider的Autotooltip模板

    這篇文章介紹了C#自定義WPF中Slider的Autotooltip模板的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#實(shí)現(xiàn)驗(yàn)證碼功能

    C#實(shí)現(xiàn)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 在C#中使用指針的示例代碼

    在C#中使用指針的示例代碼

    C#向開(kāi)發(fā)人員隱藏了大部分基本內(nèi)存管理操作,因?yàn)樗褂昧死厥掌骱鸵?但是,有時(shí)候我們也需要直接訪問(wèn)內(nèi)存,例如:進(jìn)行平臺(tái)調(diào)用,性能優(yōu)化等等,本文給大家介紹了在C#中使用指針的示例代碼,需要的朋友可以參考下
    2024-10-10
  • c#二進(jìn)制逆序方法詳解

    c#二進(jìn)制逆序方法詳解

    這篇文章介紹了c#二進(jìn)制逆序方法,有需要的朋友可以參考一下
    2013-10-10
  • Dictionary擴(kuò)展基礎(chǔ)類向字典中添加鍵和值

    Dictionary擴(kuò)展基礎(chǔ)類向字典中添加鍵和值

    Dictionary<TKey, TValue> 類是常用的一個(gè)基礎(chǔ)類,但用起來(lái)有時(shí)確不是很方便。本文逐一討論,并使用擴(kuò)展方法解決
    2013-11-11
  • C#排序算法之歸并排序

    C#排序算法之歸并排序

    這篇文章主要為大家詳細(xì)介紹了C#排序算法之歸并排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01

最新評(píng)論