zoukankan      html  css  js  c++  java
  • 一些简单的帮助类(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技术交流

  • 相关阅读:
    2333
    STL string
    后缀自动机的应用
    省选一轮
    等价类计数问题(Polya定理和burnside引理)
    Prufer序列与树的计数(坑)
    分治算法
    生成函数
    莫队算法
    Xamarin 技术解析
  • 原文地址:https://www.cnblogs.com/ab12/p/3751482.html
Copyright © 2011-2022 走看看