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)); }
/// <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); }