void Main()
{
Expression<Func<string, bool>> expr1 = s => s.Length > 2;
expr1.Dump();
Expression<Func<string, bool>> expr2 = s => s.Length < 10;
expr2.Dump();
var expr = CombineLambdas(ExpressionType.OrElse, expr1, expr2);
expr.Dump();
}
public Expression<Func<TArg, TResult>> CombineLambdas<TArg, TResult>(
ExpressionType binaryType,
Expression<Func<TArg, TResult>> first,
Expression<Func<TArg, TResult>> second)
{
var newParam = first.Parameters[0];
var oldParam = second.Parameters[0];
var visitor = new ParameterReplacementVisitor(oldParam, newParam);
var firstBody = first.Body;
var secondBody = visitor.Visit(second.Body);
return Expression.Lambda<Func<TArg, TResult>>(
Expression.MakeBinary(binaryType, firstBody, secondBody),
newParam);
}
public class ParameterReplacementVisitor : ExpressionVisitor
{
private readonly ParameterExpression _oldParam;
private readonly ParameterExpression _newParam;
public ParameterReplacementVisitor(ParameterExpression oldParam, ParameterExpression newParam)
{
_oldParam = oldParam;
_newParam = newParam;
}
protected override Expression VisitParameter(ParameterExpression parameter)
{
if (parameter == _oldParam)
return _newParam;
return parameter;
}
}