public static Expression Member(Expression lhs, string memberName)
 {
     if (!lhs.Type.IsDynamic())
     {
         return(Expression.PropertyOrField(lhs, memberName));
     }
     return(DynamicOp.GetMember(lhs, memberName));
 }
 public static Expression Negate(Expression lhs)
 {
     if (lhs.Type.IsDynamic())
     {
         return(DynamicOp.UnaryOp(lhs, ExpressionType.Negate));
     }
     return(Expression.Negate(lhs));
 }
Beispiel #3
0
        /// <summary>produce comparison based on IComparable types</summary>
        public static Expression CompareTo(Expression lhs, Expression rhs, ExpressionType exprType)
        {
            if (lhs.Type.IsDynamic() || rhs.Type.IsDynamic())
            {
                return(DynamicOp.BinaryOpPredicate(lhs, rhs, exprType));
            }

            lhs = ExpressionHelper.Coerce(lhs, rhs);
            rhs = ExpressionHelper.Coerce(rhs, lhs);
            var compareToMethod = lhs.Type.GetMethod("CompareTo", new[] { rhs.Type })
                                  ?? lhs.Type.GetMethod("CompareTo", new[] { typeof(object) });

            if (compareToMethod == null)
            {
                throw new ArgumentException("unexpected IComparable types for instance: " + lhs.Type + " compared to " + rhs.Type);
            }
            Expression compare = Expression.Call(lhs, compareToMethod, new[] { rhs });

            return(CompareTo(exprType, compare));
        }
        public static Expression MathOp(Expression lhs, Expression rhs, ExpressionType expressionType)
        {
            var coerceLeft  = ExpressionHelper.Coerce(lhs, rhs);
            var coerceRight = ExpressionHelper.Coerce(rhs, lhs);

            if (lhs.Type.IsDynamic() || rhs.Type.IsDynamic())
            {
                DynamicOp.BinaryOp(coerceLeft, coerceRight, expressionType);
            }

            Expression expression;

            switch (expressionType)
            {
            case ExpressionType.Add:
                expression = Expression.Add(coerceLeft, coerceRight);
                break;

            case ExpressionType.Subtract:
                expression = Expression.Subtract(coerceLeft, coerceRight);
                break;

            case ExpressionType.Multiply:
                expression = Expression.Multiply(coerceLeft, coerceRight);
                break;

            case ExpressionType.Divide:
                expression = Expression.Divide(coerceLeft, coerceRight);
                break;

            case ExpressionType.Modulo:
                expression = Expression.Modulo(coerceLeft, coerceRight);
                break;

            default:
                throw new ArgumentException("unknown math type:  " + expressionType);
            }
            return(expression);
        }