using Masuit.Tools.Mapping.Visitor; using System; using System.Collections.Generic; using System.Linq.Expressions; namespace Masuit.Tools.Mapping.Extensions { /// ///表达式树扩展 /// public static class ExpressionExtentions { /// /// 转换 /// /// 源类型 /// 来源 /// 目标类型 /// public static Expression ConvertTo(this Expression> from, Type toType) { return ConvertImpl(from, toType); } /// /// 转换 /// /// 源类型 /// 来源 /// 目标类型 /// public static Expression ConvertTo(this Expression> from, Type toType) { return ConvertImpl(from, toType); } /// /// 转换Lambda表达式树 /// /// 源类型 /// 目标类型 /// 来源 /// public static Expression ConvertTo(this Expression> from) { return ConvertImpl(from, typeof(TTo)); } /// /// 转换表达式树 /// /// 源类型的表达式树 /// 目标类型的表达式树 /// 源类型的表达式树 /// 表达式转换或如果没有找到映射原始表达式。 public static Expression> ConvertTo(this Expression> from) { return (Expression>)ConvertImpl(from, typeof(TTo)); } private static Expression ConvertImpl(Expression from, Type toType) where TFrom : class { // 重新映射不同类型的所有参数 Dictionary parameterMap = new Dictionary(); ParameterExpression[] newParams = new ParameterExpression[from.Parameters.Count]; for (int i = 0; i < newParams.Length; i++) { newParams[i] = Expression.Parameter(toType, from.Parameters[i].Name); parameterMap[from.Parameters[i]] = newParams[i]; } // 重新构建表达式树 var body = new ConverterExpressionVisitor(parameterMap, toType).Visit(from.Body); return Expression.Lambda(body, newParams); } } }