一些简单的帮助类(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>
<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>
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- C#中struct和class的区别详解
- PostgreSQL ERROR: invalid escape string 解决办法
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- 详解C++中实现继承string类的MyString类的步骤
- PHP STRING 陷阱原理说明
- 深入了解PHP类Class的概念
- c#中 String和string的区别介绍