Welcome

首页 / 软件开发 / .NET编程技术 / 对String进行类型验证的帮助类

对String进行类型验证的帮助类2015-12-03在工作中经常会遇到 验证String 中的值是否属于Int型或者是Bool又或是Date

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

string strValue = "123";

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/>", "12131312".Is<int>()));Response.Write(string.Format("121313123131231 Is int ={0}<br/>", "121313123131231".Is<int>()));Response.Write(string.Format("1231231231313123 Is int ={0}<br/>", "1231231231313123".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/>", "1".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