Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement