一些简单的帮助类(1)-- String的类型验证

在工作中经常会遇到 验证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

 技术交流群NET技术交流

原文地址:https://www.cnblogs.com/ab12/p/3751482.html