public static object Negate(object target) { if (target == null) { return(null); } if (target.GetType().IsCOMObject) { target = GetDefaultPropertyValue(target); } return(-(double)BuiltInFunctions.CDbl(target)); }
public static object Not(object target) { if (target == null) { return(null); } if (target.GetType().IsCOMObject) { target = GetDefaultPropertyValue(target); } return(!(bool)BuiltInFunctions.CBool(target)); }
public static object BinaryOp(ExpressionType op, object left, object right) { if (left == null || right == null) { if (op == ExpressionType.Equal) { if (left == null && right == null) { return(true); } else if (string.Empty.Equals(left) || string.Empty.Equals(right)) { return(true); } else { return(false); } } else if (op == ExpressionType.NotEqual) { if (left == null && right == null) { return(false); } else if (string.Empty.Equals(left) || string.Empty.Equals(right)) { return(false); } else { return(true); } } else { return(null); } } Type ltype = left.GetType(); Type rtype = right.GetType(); if (op == ExpressionType.Equal) { if (left == right) { return(true); } } if (ltype.IsCOMObject) { left = GetDefaultPropertyValue(left); ltype = left.GetType(); } if (rtype.IsCOMObject) { right = GetDefaultPropertyValue(right); rtype = right.GetType(); } if (!ltype.IsValueType && ltype != typeof(string)) { left = left.ToString(); ltype = typeof(string); } if (!rtype.IsValueType && rtype != typeof(string)) { right = right.ToString(); rtype = typeof(string); } Type targetType; if (ltype == rtype || CanConvert(rtype, ltype)) { targetType = ltype; } else { targetType = rtype; } switch (op) { case ExpressionType.Add: if (targetType == typeof(int)) { return(Convert.ToInt32(left) + Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) + Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) + Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) + Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) + Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { return((string)left + (string)right); } break; case ExpressionType.Subtract: if (targetType == typeof(int)) { return(Convert.ToInt32(left) - Convert.ToInt32(right)); } else if (targetType == typeof(double) || targetType == typeof(string)) { return(Convert.ToDouble(left) - Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) - Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) - Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) - Convert.ToDecimal(right)); } break; case ExpressionType.Multiply: if (targetType == typeof(int)) { return(Convert.ToInt32(left) * Convert.ToInt32(right)); } else if (targetType == typeof(double) || targetType == typeof(string)) { return(Convert.ToDouble(left) * Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) * Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) * Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) * Convert.ToDecimal(right)); } break; case ExpressionType.Divide: if (targetType == typeof(int)) { return(Convert.ToInt32(left) / Convert.ToInt32(right)); } else if (targetType == typeof(double) || targetType == typeof(string)) { return(Convert.ToDouble(left) / Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) / Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) / Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) / Convert.ToDecimal(right)); } break; case ExpressionType.Equal: try { if (targetType == typeof(int)) { return(Convert.ToInt32(left) == Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) == Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) == Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) == Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) == Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { return(((string)left).Equals(right)); } else if (targetType == typeof(DateTime)) { return(Convert.ToDateTime(left) == Convert.ToDateTime(right)); } else { return(left == right); } } catch (Exception ex) { return(false); } case ExpressionType.NotEqual: try { if (targetType == typeof(int)) { return(Convert.ToInt32(left) != Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) != Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) != Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) != Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) != Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { return(!((string)left).Equals(right)); } else if (targetType == typeof(DateTime)) { return(Convert.ToDateTime(left) != Convert.ToDateTime(right)); } else { return(left != right); } } catch (Exception ex) { return(true); } case ExpressionType.GreaterThan: if (targetType == typeof(int)) { return(Convert.ToInt32(left) > Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) > Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) > Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) > Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) > Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { int result = ((string)left).CompareTo(right); return(result > 0); } else if (targetType == typeof(DateTime)) { return(Convert.ToDateTime(left) > Convert.ToDateTime(right)); } break; case ExpressionType.GreaterThanOrEqual: if (targetType == typeof(int)) { return(Convert.ToInt32(left) >= Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) >= Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) >= Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) >= Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) >= Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { int result = ((string)left).CompareTo(right); return(result >= 0); } else if (targetType == typeof(DateTime)) { return(Convert.ToDateTime(left) >= Convert.ToDateTime(right)); } break; case ExpressionType.LessThan: if (targetType == typeof(int)) { return(Convert.ToInt32(left) < Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) < Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) < Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) < Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) < Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { int result = ((string)left).CompareTo(right); return(result < 0); } else if (targetType == typeof(DateTime)) { return(Convert.ToDateTime(left) < Convert.ToDateTime(right)); } break; case ExpressionType.LessThanOrEqual: if (targetType == typeof(int)) { return(Convert.ToInt32(left) <= Convert.ToInt32(right)); } else if (targetType == typeof(double)) { return(Convert.ToDouble(left) <= Convert.ToDouble(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) <= Convert.ToInt64(right)); } else if (targetType == typeof(float)) { return(Convert.ToSingle(left) <= Convert.ToSingle(right)); } else if (targetType == typeof(decimal)) { return(Convert.ToDecimal(left) <= Convert.ToDecimal(right)); } else if (targetType == typeof(string)) { int result = ((string)left).CompareTo(right); return(result <= 0); } else if (targetType == typeof(DateTime)) { return(Convert.ToDateTime(left) <= Convert.ToDateTime(right)); } break; case ExpressionType.And: if (targetType == typeof(bool)) { return((bool)left && (bool)right); } else if (targetType == typeof(int)) { return(Convert.ToInt32(left) & Convert.ToInt32(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) & Convert.ToInt64(right)); } else { return((bool)BuiltInFunctions.CBool(left) && (bool)BuiltInFunctions.CBool(right)); } break; case ExpressionType.Or: if (targetType == typeof(bool)) { return((bool)left || (bool)right); } else if (targetType == typeof(int)) { return(Convert.ToInt32(left) | Convert.ToInt32(right)); } else if (targetType == typeof(long)) { return(Convert.ToInt64(left) | Convert.ToInt64(right)); } else { return((bool)BuiltInFunctions.CBool(left) || (bool)BuiltInFunctions.CBool(right)); } break; } throw new ArgumentException(string.Format("Operation {0} between {1} and {2} is not implemeted.", op, ltype.Name, rtype.Name)); }