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);
}
}
}