Пример #1
0
 public abstract void Visit(BinaryExpresssion expression);
Пример #2
0
        public override void Visit(BinaryExpresssion expression)
        {
            // Evaluates the left expression and saves the value
            expression.LeftExpression.Accept(this);
            object left = result;

            // Evaluates the right expression and saves the value
            expression.RightExpression.Accept(this);
            object right = result;

            switch (expression.Type)
            {
            case BinaryExpressionType.And:
                result = Convert.ToBoolean(left) && Convert.ToBoolean(right);
                break;

            case BinaryExpressionType.Or:
                result = Convert.ToBoolean(left) || Convert.ToBoolean(right);
                break;

            case BinaryExpressionType.Div:
                result = Convert.ToDecimal(left) / Convert.ToDecimal(right);
                break;

            case BinaryExpressionType.Equal:
                // Use the type of the left operand to make the comparison
                result = Comparer.Default.Compare(left,
                                                  Convert.ChangeType(right, left.GetType())) == 0;
                break;

            case BinaryExpressionType.Greater:
                // Use the type of the left operand to make the comparison
                result = Comparer.Default.Compare(left,
                                                  Convert.ChangeType(right, left.GetType())) > 0;
                break;

            case BinaryExpressionType.GreaterOrEqual:
                // Use the type of the left operand to make the comparison
                result = Comparer.Default.Compare(left,
                                                  Convert.ChangeType(right, left.GetType())) >= 0;
                break;

            case BinaryExpressionType.Lesser:
                // Use the type of the left operand to make the comparison
                result = Comparer.Default.Compare(left,
                                                  Convert.ChangeType(right, left.GetType())) < 0;
                break;

            case BinaryExpressionType.LesserOrEqual:
                // Use the type of the left operand to make the comparison
                result = Comparer.Default.Compare(left,
                                                  Convert.ChangeType(right, left.GetType())) <= 0;
                break;

            case BinaryExpressionType.Minus:
                result = Convert.ToDecimal(left) - Convert.ToDecimal(right);
                break;

            case BinaryExpressionType.Modulo:
                result = Convert.ToDecimal(left) % Convert.ToDecimal(right);
                break;

            case BinaryExpressionType.NotEqual:
                // Use the type of the left operand to make the comparison
                result = Comparer.Default.Compare(left,
                                                  Convert.ChangeType(right, left.GetType())) != 0;
                break;

            case BinaryExpressionType.Plus:
                result = Convert.ToDecimal(left) + Convert.ToDecimal(right);
                break;

            case BinaryExpressionType.Times:
                result = Convert.ToDecimal(left) * Convert.ToDecimal(right);
                break;

            case BinaryExpressionType.Pow:
                result = Math.Pow(Convert.ToDouble(left), Convert.ToDouble(right));
                break;
            }
        }