Expression ReplaceParameter(IDictionary<Expression,Expression> expressionAccessors, Expression expression, Action<string> setName)
{
return expression.Convert(expr =>
{
if (expr.NodeType == ExpressionType.Constant)
{
var c = (ConstantExpression)expr;
if (!ExpressionHelper.IsConstant(expr.Type) || _asParameters.Contains(c))
{
var val = expressionAccessors[expr];
expr = Expression.Convert(val, expr.Type);
if (expression.NodeType == ExpressionType.MemberAccess)
{
var ma = (MemberExpression)expression;
setName(ma.Member.Name);
}
}
}
return expr;
});
}