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

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

        string strValue = "";
int intValue;
bool isInt = int.TryParse(strValue, out intValue);

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

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

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

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

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

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

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

/// <summary>
/// TypeValidate 的摘要说明
/// </summary>
public static class TypeValidate
{
/// <summary>
/// 类型T必须具备
/// (1)无参构造方法
/// (2)方法签名为 bool TryParse(string,T)的方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
[SecuritySafeCritical]
public static bool Is<T>(this string value) where T : IConvertible
{
var type = typeof(T);
Type[] types = { typeof(string), type.MakeByRefType() };
var Method = type.GetMethod("TryParse", types);
if (Method == null)
{
throw new TryParseException();
}
try
{
T Convertible = Activator.CreateInstance<T>();
return (bool)Method.Invoke(Convertible, new object[] { value, Convertible });
}
catch
{
throw new TryParseException();
}
}
}
/// <summary>
/// 类型没有方法 TryParse 或 没有无参构造方法 或没有方法签名 bool TryParse(String,T)的方法
/// </summary>
public class TryParseException : Exception
{
}

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

测试代码

 Response.Write(string.Format("12131312 Is int ={0}<br/>", "".Is<int>()));
Response.Write(string.Format("121313123131231 Is int ={0}<br/>", "".Is<int>()));
Response.Write(string.Format("1231231231313123 Is int ={0}<br/>", "".Is<int>()));
Response.Write(string.Format("adadasda Is int ={0}<br/>", "adadasda".Is<int>()));
Response.Write(string.Format("true Is bool ={0}<br/>", "true".Is<bool>()));
Response.Write(string.Format("1 Is bool ={0}<br/>", "".Is<bool>()));
Response.Write(string.Format("2013/4/5 06:06:06 Is Date ={0}<br/>", "2013/4/5 06:06:06".Is<DateTime>()));

结果

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

技术交流群

一些简单的帮助类(1)-- String的类型验证的更多相关文章

  1. Item 30 用enum代替int常量类型枚举,string常量类型枚举

    1.用枚举类型替代int枚举类型和string枚举类型 public class Show {   // Int枚举类型   // public static final int APPLE_FUJI ...

  2. 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

    标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...

  3. JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

    JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...

  4. C++ 最简单的日志类

    最近搞一个 C++ 项目的二次开发,没玩过 C++,可谓步履维艰.自己写个简单的日志类都被各种坑折磨.终于搞定了. 参考了这篇博客,并且进一步简化:https://www.cnblogs.com/Ds ...

  5. 标准C++类std::string的内存共享和Copy-On-Write...

    标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否 ...

  6. 【转】标准C++类std::string的内存共享和Copy-On-Write技术

    1.             概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功 ...

  7. 标准C++类std::string的内存共享和Copy-On-Write技术

    标准C++类std::string的  内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是 ...

  8. C++定义一个简单的Computer类

    /*定义一个简单的Computer类 有数据成员芯片(cpu).内存(ram).光驱(cdrom)等等, 有两个公有成员函数run.stop.cpu为CPU类的一个对象, ram为RAM类的一个对象, ...

  9. Java Object类 和 String类 常见问答 6k字+总结

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

随机推荐

  1. JDK1.5新特性(二)……Static Import

    援引 Static Import - This facility lets you avoid qualifying static members with class names without t ...

  2. Storm系列(十三)架构分析之Worker-维护ZMQ连接

    Worker根据Topology的定义及分配到自身的任务情况,计算出发出的消息被那些Task接收,由于Worker上分配的任务可能被调整,因此Worker需要定时的更新这些连接信息. ZMQ连接信息更 ...

  3. 创建二叉树,C语言实现

    一.前序遍历创建二叉树,使用递归,头文件 BiTree.h /*槽点一:创建树时用scanf输入不成功*/ #ifndef BITREE_H #define BITREE_H #include< ...

  4. Java到底是不是一种纯面向对象语言?

    本文由码农网 – Dee1024原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它. 在我刚开始学习 J ...

  5. 问题.NETwebservice其他电脑无法使用-测试窗体只能用于来自本地计算机的请求

    问题:webservice其他电脑无法使用-测试窗体只能用于来自本地计算机的请求 问题现象: 本地测试没有问题. 其他电脑打开webservice出现 测试窗体只能用于来自本地计算机的请求. 或者 & ...

  6. 问题-提示“adodataset.command”

    问题现象:提示“adodataset.command” 问题原因:原因不明,希望高人指点. 问题处理:如果报adodataset.command ,如果忽略将删除控件的错误时,你应该可以看一看是不是在 ...

  7. Delphi- 连接MySQL数据库BDE

    Delphi使用ADO可以连接MSSQL和ACCESS,但似乎不能连接MYSQL和ORACEL,如果要连接MYSQL和ORACLE得使用BDE. 一.连接方法 首先得先安装mysql驱动程序_mysq ...

  8. 利用http协议实现图片窃取

    在http协议里有一个referer,用来标示站点来源,大家都遇到这样的情况.转载了一篇博客,图片显示不正常,就和头信息里这个有关 原理:在webserver里面.依据http协议里面refered头 ...

  9. 安装Rational Rose启动报错:无法启动此程序,由于计算机中丢失 suite objects.dll。

    执行Rational Rose的时候假设出现这种错误,先检查环境变量有没有common的地址,假设没有直接配上就OK:配置例如以下:D:\Program Files\Rational\Common; ...

  10. [Javascript] Ex: concatAll, map and filter

    concatAll: Array.prototype.concatAll = function() { var results = []; this.forEach(function(subArray ...