/* This class was copied from Mehfuz's LinqExtender project, which is available from github. * http://mehfuzh.github.com/LinqExtender/ */ using System; using System.Linq.Expressions; namespace NzbDrone.Core.Datastore { /// /// Expression visitor /// public class ExpressionVisitor { /// /// Visits expression and delegates call to different to branch. /// /// /// protected virtual Expression Visit(Expression expression) { if (expression == null) { return null; } switch (expression.NodeType) { case ExpressionType.Lambda: return VisitLamda((LambdaExpression)expression); case ExpressionType.ArrayLength: case ExpressionType.Convert: case ExpressionType.ConvertChecked: case ExpressionType.Negate: case ExpressionType.UnaryPlus: case ExpressionType.NegateChecked: case ExpressionType.Not: case ExpressionType.Quote: case ExpressionType.TypeAs: return VisitUnary((UnaryExpression)expression); case ExpressionType.Add: case ExpressionType.AddChecked: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.ArrayIndex: case ExpressionType.Coalesce: case ExpressionType.Divide: case ExpressionType.Equal: case ExpressionType.ExclusiveOr: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.LeftShift: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.Modulo: case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: case ExpressionType.NotEqual: case ExpressionType.Or: case ExpressionType.OrElse: case ExpressionType.Power: case ExpressionType.RightShift: case ExpressionType.Subtract: case ExpressionType.SubtractChecked: return VisitBinary((BinaryExpression)expression); case ExpressionType.Call: return VisitMethodCall((MethodCallExpression)expression); case ExpressionType.Constant: return VisitConstant((ConstantExpression)expression); case ExpressionType.MemberAccess: return VisitMemberAccess((MemberExpression)expression); case ExpressionType.Parameter: return VisitParameter((ParameterExpression)expression); } throw new ArgumentOutOfRangeException("expression", expression.NodeType.ToString()); } /// /// Visits the constance expression. To be implemented by user. /// /// /// protected virtual Expression VisitConstant(ConstantExpression expression) { return expression; } /// /// Visits the member access expression. To be implemented by user. /// /// /// protected virtual Expression VisitMemberAccess(MemberExpression expression) { return expression; } /// /// Visits the method call expression. To be implemented by user. /// /// /// protected virtual Expression VisitMethodCall(MethodCallExpression expression) { throw new NotImplementedException(); } /// /// Visits the binary expression. /// /// /// protected virtual Expression VisitBinary(BinaryExpression expression) { Visit(expression.Left); Visit(expression.Right); return expression; } /// /// Visits the unary expression. /// /// /// protected virtual Expression VisitUnary(UnaryExpression expression) { Visit(expression.Operand); return expression; } /// /// Visits the lamda expression. /// /// /// protected virtual Expression VisitLamda(LambdaExpression lambdaExpression) { Visit(lambdaExpression.Body); return lambdaExpression; } private Expression VisitParameter(ParameterExpression expression) { return expression; } } }