一些简单的帮助类(1)-- String的类型验证
在工作中经常会遇到 验证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的类型验证的更多相关文章
- Item 30 用enum代替int常量类型枚举,string常量类型枚举
1.用枚举类型替代int枚举类型和string枚举类型 public class Show { // Int枚举类型 // public static final int APPLE_FUJI ...
- 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...
- JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较
JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...
- C++ 最简单的日志类
最近搞一个 C++ 项目的二次开发,没玩过 C++,可谓步履维艰.自己写个简单的日志类都被各种坑折磨.终于搞定了. 参考了这篇博客,并且进一步简化:https://www.cnblogs.com/Ds ...
- 标准C++类std::string的内存共享和Copy-On-Write...
标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否 ...
- 【转】标准C++类std::string的内存共享和Copy-On-Write技术
1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功 ...
- 标准C++类std::string的内存共享和Copy-On-Write技术
标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是 ...
- C++定义一个简单的Computer类
/*定义一个简单的Computer类 有数据成员芯片(cpu).内存(ram).光驱(cdrom)等等, 有两个公有成员函数run.stop.cpu为CPU类的一个对象, ram为RAM类的一个对象, ...
- Java Object类 和 String类 常见问答 6k字+总结
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
随机推荐
- makefile 中 $@ $^ %< 使用
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在L ...
- Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!
Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...
- 数据流模型、Storm数据流模型
- 教程-隐藏/显示任务栏-程序不在任务显示-全面控制Windows
1.隐藏任务条 var h:THandle; //变量h:=FindWindow('Shell_TrayWnd',nil);ShowWindow(h,SW_hide); 2.显示任务条h:=Find ...
- Linux学习笔记——软件包管理
1.RPM包的管理 RPM软件包的一个例子: sudo-1.7.2p1-5.el5.i386.rpm 这个rpm包名包括软件名sudo,版本号1.7.2p1,发行号5.el5,和硬件平台i386 (1 ...
- 团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写
1 前言 考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题. 在 Linux 下有个很古老但很有 ...
- Java字节转换类实现
Java的类库支持完全不如C#,比如时间类,比如数据类型转换类等等,难道是我自己没找到吗? 下面是字节转换类,byte[]与short, int, long, float, double, Strin ...
- Mybatis上路_05-使用命令行自动生成
http://my.oschina.net/vigiles/blog/125127 目录[-] 1.数据准备: 1)建库: 2)建表: 3)预设数据: 2.编写Generator执行配置文件: 3.搭 ...
- cocos2d-x学习笔记
转自:http://blog.csdn.net/we000636/article/details/8263503 接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 JNI:允许 ...
- Windows Server 2012 R2中的网络诊断命令
Get-NetAdapter Get-NetIPAddress Get-NetIPConfiguration(GIP) TNC :Pinging Servers and Trace Route tnc ...