Expression 反射调用TryParse

来源:互联网 发布:捷安特淘宝旗舰店 编辑:程序博客网 时间:2024/05/16 19:30
public static class StringExtenssion    {        #region ///string 转其他类型数据        /// <summary>        /// TryParse委托        /// </summary>        /// <typeparam name="TStr">String</typeparam>        /// <typeparam name="TOut">Out T</typeparam>        /// <typeparam name="TResult">返回值</typeparam>        /// <param name="str">要转换的字符串</param>        /// <param name="outValue">out 输出参数</param>        /// <returns>成功true,失败false</returns>        public delegate TResult FuncEx<T1, TOut, TResult>(T1 str, out TOut outValue);        /// <summary>        /// Parse        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="str"></param>        /// <param name="defaultValue"></param>        /// <returns></returns>        public static T Parse<T>(this string str)        {            Type t = typeof(T);            var param_str = Expression.Parameter(typeof(string));            var method = typeof(T).GetMethod("Parse", new Type[] { typeof(string)});            //方法不存在            if (method == null)            {                throw new Exception("找到不Parse方法");            }            var methodExp = Expression.Call(method, param_str);            var parse = Expression.Lambda<Func<string,T>>(methodExp, param_str).Compile();            return parse(str);        }        /// <summary>        /// TryParse        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="str"></param>        /// <param name="defaultValue"></param>        /// <returns></returns>        public static T TryParse<T>(this string str, T defaultValue)        {            Type t = typeof(T);            T outValue = defaultValue;            var param_str = Expression.Parameter(typeof(string));            var param_outValue = Expression.Parameter(typeof(T).MakeByRefType());            var method = typeof(T).GetMethod("TryParse", new Type[] { typeof(string), typeof(T).MakeByRefType() });            //方法不存在            if (method == null)            {                return defaultValue;            }            var methodExp = Expression.Call(method, param_str, param_outValue);            var tryParse = Expression.Lambda<FuncEx<string, T, bool>>(methodExp, param_str, param_outValue).Compile();            return tryParse(str, out outValue) ? outValue : defaultValue;        }        #endregion    }

0 0