您的位置:首页 > 其它

一些简单的帮助类(1)-- String的类型验证

2016-05-13 14:21 239 查看

<p>在工作中经常会遇到 验证String 中的值是否属于Int型或者是Bool又或是Date</p>

<p>一般的做法是用方法 类型.TryParse(string,类型) 来做验证.</p>

<div class="cnblogs_code">

<pre>        <span style="color: #0000ff;">string</span> strValue = <span style="color: #800000;">"</span><span style="color: #800000;">123</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> intValue;

        </span><span style="color: #0000ff;">bool</span> isInt = <span style="color: #0000ff;">int</span>.TryParse(strValue, <span style="color: #0000ff;">out</span> intValue);        </pre>

</div>

<p> </p>

<p>但是使用此方法需要创建一个该类型的变量.我工作中写的是WEB程序经常一个页面要验证来自前台的值类型有10几个,这样就略显有点麻烦了. 因为我们只要判断下string的值是不是这个类型就好.</p>

<p>我发现这个TryParse方法基本 bool int date 这些类型都会存在 但是查找了下他们的接口里均没有此方法.又查询了一遍IConvertible接口子类发现所有子类均存在此方法</p>

<p>于是就用想法给String 加上一个名为 Is的扩展方法</p>

<p>因为 TryParse 方法不是实现接口定义的。而C#系统类库中实现IConvertible接口的几乎都有TryParse 方法我们就定义类型T是继承IConvertible的;</p>

<p>但也有可能类型T没有TryParse 方法或者方法签名不是string,out T</p>

<p>这种情况下我们抛出一个自定义异常 TryParseException </p>

<p>还有一点要注意使用反射查找 TryParse 方法时指定方法的参数类型为 {typeof(string),typeof(T)}查询结果是NULL 因为 TryParse 的第二个参数声明是 out 的,要使用{typeof(string),typeof(T).MakeByRefType()}才能查找到该方法</p>

<div class="cnblogs_code">

<pre><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>

<span style="color: #808080;">///</span><span style="color: #008000;"> TypeValidate 的摘要说明

</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> TypeValidate

{

    </span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>

    <span style="color: #808080;">///</span><span style="color: #008000;"> 类型T必须具备

    </span><span style="color: #808080;">///</span><span style="color: #008000;"> (1)无参构造方法

    </span><span style="color: #808080;">///</span><span style="color: #008000;"> (2)方法签名为 bool TryParse(string,T)的方法

    </span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>

    <span style="color: #808080;">///</span> <span style="color: #808080;"><typeparam name="T"></typeparam></span>

    <span style="color: #808080;">///</span> <span style="color: #808080;"><param name="value"></param></span>

    <span style="color: #808080;">///</span> <span style="color: #808080;"><returns></returns></span>

<span style="color: #000000;">    [SecuritySafeCritical]

    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">bool</span> Is<T>(<span style="color: #0000ff;">this</span> <span style="color: #0000ff;">string</span> value) <span style="color:
#0000ff;">where</span><span style="color: #000000;"> T : IConvertible

    {

        </span><span style="color: #0000ff;">var</span> type = <span style="color: #0000ff;">typeof</span><span style="color: #000000;">(T);

        Type[] types </span>= { <span style="color: #0000ff;">typeof</span>(<span style="color: #0000ff;">string</span><span style="color: #000000;">), type.MakeByRefType() };

        </span><span style="color: #0000ff;">var</span> Method = type.GetMethod(<span style="color: #800000;">"</span><span style="color: #800000;">TryParse</span><span style="color: #800000;">"</span><span style="color: #000000;">, types);

        </span><span style="color: #0000ff;">if</span> (Method == <span style="color: #0000ff;">null</span><span style="color: #000000;">)

        {

            </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> TryParseException();

        }

        </span><span style="color: #0000ff;">try</span><span style="color: #000000;">

        {

            T Convertible </span>= Activator.CreateInstance<T><span style="color: #000000;">();

            </span><span style="color: #0000ff;">return</span> (<span style="color: #0000ff;">bool</span>)Method.Invoke(Convertible, <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">object</span><span style="color: #000000;">[] { value,
Convertible });

        }

        </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">

        {

            </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> TryParseException();

        }

    }

}

</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>

<span style="color: #808080;">///</span><span style="color: #008000;"> 类型没有方法 TryParse 或 没有无参构造方法 或没有方法签名 bool TryParse(String,T)的方法

</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> TryParseException : Exception

{

}</span></pre>

</div>

<p>这个帮助类就算是完成了 我们来试下效果吧!</p>

<p>测试代码</p>

<div class="cnblogs_code">

<pre> Response.Write(<span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">12131312 Is int ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span
style="color: #800000;">12131312</span><span style="color: #800000;">"</span>.Is<<span style="color: #0000ff;">int</span>><span style="color: #000000;">()));

        Response.Write(</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">121313123131231 Is int ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span
style="color: #800000;">121313123131231</span><span style="color: #800000;">"</span>.Is<<span style="color: #0000ff;">int</span>><span style="color: #000000;">()));

        Response.Write(</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">1231231231313123 Is int ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span
style="color: #800000;">1231231231313123</span><span style="color: #800000;">"</span>.Is<<span style="color: #0000ff;">int</span>><span style="color: #000000;">()));

        Response.Write(</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">adadasda Is int ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span
style="color: #800000;">adadasda</span><span style="color: #800000;">"</span>.Is<<span style="color: #0000ff;">int</span>><span style="color: #000000;">()));

        Response.Write(</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">true Is bool ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span
style="color: #800000;">true</span><span style="color: #800000;">"</span>.Is<<span style="color: #0000ff;">bool</span>><span style="color: #000000;">()));

        Response.Write(</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">1 Is bool ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span
style="color: #800000;">1</span><span style="color: #800000;">"</span>.Is<<span style="color: #0000ff;">bool</span>><span style="color: #000000;">()));

        Response.Write(</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">2013/4/5 06:06:06 Is Date ={0}<br/></span><span style="color: #800000;">"</span>, <span style="color:
#800000;">"</span><span style="color: #800000;">2013/4/5 06:06:06</span><span style="color: #800000;">"</span>.Is<DateTime>()));</pre>

</div>

<p>结果</p>

<p> </p>

<p>12131312 Is int =True<br />121313123131231 Is int =False<br />1231231231313123 Is int =False<br />adadasda Is int =False<br />true Is bool =True<br />1 Is bool =False<br />2013/4/5 06:06:06 Is Date =True</p>

<p> 技术交流群<a href="http://shang.qq.com/wpa/qunwpa?idkey=4c6c8ad6db22a4e8b6bfd5d998b9f89a033043c491890fae5a223e0ada34a9c0"
target="_blank"><img title="NET技术交流" src="http://pub.idqqimg.com/wpa/images/group.png" alt="NET技术交流" border="0" /></a></p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息