C# TextBox 扩展方法数据验证详细说明

 更新时间:2020年6月25日 11:42  点击:2391

      查看公司项目代码时,存在这样一个问题: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) { }
        }

如果输入值非法,则提示错误,如图所示:

[!--infotagslink--]

相关文章

  • Django def clean()函数对表单中的数据进行验证操作

    这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09
  • JavaScript实现密码框输入验证

    这篇文章主要为大家详细介绍了JavaScript实现密码框输入验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-01
  • Nest.js 授权验证的方法示例

    这篇文章主要介绍了Nest.js 授权验证的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
  • el-table树形表格表单验证(列表生成序号)

    这篇文章主要介绍了el-table树形表格表单验证(列表生成序号),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
  • js canvas实现滑块验证

    这篇文章主要为大家详细介绍了js canvas实现滑块验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)

    这篇文章主要介绍了JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-06-15
  • selenium 反爬虫之跳过淘宝滑块验证功能的实现代码

    这篇文章主要介绍了selenium 反爬虫之跳过淘宝滑块验证功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-27
  • C#使用RichTextBox实现替换文字及改变字体颜色功能示例

    这篇文章主要介绍了C#使用RichTextBox实现替换文字及改变字体颜色功能,结合实例形式洗了C#中RichTextBox组件文字替换及改变字体颜色相关操作技巧,需要的朋友可以参考下...2020-06-25
  • vue element table中自定义一些input的验证操作

    这篇文章主要介绍了vue element table中自定义一些input的验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-18
  • C# TextBox数据绑定的方法

    这篇文章主要为大家详细介绍了C# TextBox数据绑定的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • vue实现表单验证小功能

    这篇文章主要为大家详细介绍了vue实现表单验证小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-29
  • javascript数据类型验证方法

    这篇文章主要为大家分享了一个简单的javascript数据类型验证方法,感兴趣的小伙伴们可以参考一下...2016-01-05
  • JavaScript表单验证示例详解

    这篇文章主要为大家详细介绍了JavaScript表单验证示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-04
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • jQuery实现表单验证功能

    这篇文章主要为大家详细介绍了jQuery实现表单验证功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-21
  • AngularJS中实现用户访问的身份认证和表单验证功能

    这篇文章主要介绍了AngularJS中实现用户访问的身份认证及表单验证功能的方法,Angular是Google开发的一款浏览器端的高人气JavaScript框架,需要的朋友可以参考下...2016-04-23
  • WindowsForm实现TextBox占位符Placeholder提示功能

    这篇文章主要介绍了WindowsForm实现TextBox占位符Placeholder提示,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-13
  • bootstrapValidator自定验证方法写法

    这篇文章主要为大家详细介绍了bootstrapValidator自定验证方法写法,研究bootstrapValidator验证,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
  • layui 正则表达式验证使用实例详解

    layui的正则表达式是在form表单中完成的,这篇文章主要介绍了layui 正则表达式验证使用教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • jquery表单验证插件validation使用方法详解

    这篇文章主要为大家详细介绍了jquery表单验证插件validation使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23