在工作中经常会遇到 验证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 { }
本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/
这个帮助类就算是完成了 我们来试下效果吧!
测试代码
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
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 方法
, 类型
, response
, bool
, string类型
, is
string类型的方法
string类型、string转date类型、string是什么类型、java string类型、c string类型,以便于您获取更多的相关知识。