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
}
Expression 反射调用TryParse
最新推荐文章于 2020-04-27 15:50:56 发布