Ejemplo n.º 1
0
        //this class simplifies this:
        //   timesheet.Entries.Any() == true
        //to this:
        //   timesheet.Entries.Any()

        private Expression ProcessBinaryExpression(Expression exprToCompare, Expression exprToReturn, ExpressionType nodeType, Expression original)
        {
            BooleanConstantFinder visitor = new BooleanConstantFinder();

            visitor.Visit(exprToCompare);

            if (visitor.Constant.HasValue)
            {
                switch (nodeType)
                {
                case ExpressionType.Equal:
                    return(visitor.Constant.Value ? exprToReturn : Expression.Not(exprToReturn));

                case ExpressionType.NotEqual:
                    return(visitor.Constant.Value ? Expression.Not(exprToReturn) : exprToReturn);

                case ExpressionType.Or:
                case ExpressionType.OrElse:
                    return(visitor.Constant.Value ? Expression.Constant(true) : exprToReturn);

                case ExpressionType.And:
                case ExpressionType.AndAlso:
                    return(visitor.Constant.Value ? exprToReturn : Expression.Constant(false));

                default:
                    return(original);
                }
            }
            else
            {
                return(original);
            }
        }
        //this class simplifies this:
        //   timesheet.Entries.Any() == true
        //to this:
        //   timesheet.Entries.Any()
        private Expression ProcessBinaryExpression(Expression exprToCompare, Expression exprToReturn, ExpressionType nodeType, Expression original)
        {
            BooleanConstantFinder visitor = new BooleanConstantFinder();
            visitor.Visit(exprToCompare);

            if (visitor.Constant.HasValue)
            {
                switch (nodeType)
                {
                    case ExpressionType.Equal:
                        return visitor.Constant.Value ? exprToReturn : Expression.Not(exprToReturn);
                    case ExpressionType.NotEqual:
                        return visitor.Constant.Value ? Expression.Not(exprToReturn) : exprToReturn;
                    case ExpressionType.Or:
                    case ExpressionType.OrElse:
                        return visitor.Constant.Value ? Expression.Constant(true) : exprToReturn;
                    case ExpressionType.And:
                    case ExpressionType.AndAlso:
                        return visitor.Constant.Value ? exprToReturn : Expression.Constant(false);
                    default:
                        return original;
                }
            }
            else
                return original;
        }