public static bool ValueEquals(object objA, object objB) { if (objA == objB) { return(true); } if (objA == null || objB == null) { return(false); } // comparing an Int32 and Int64 both of the same value returns false // make types the same then compare if (objA.GetType() != objB.GetType()) { if (ConvertUtils.IsInteger(objA) && ConvertUtils.IsInteger(objB)) { return(Convert.ToDecimal(objA, CultureInfo.CurrentCulture).Equals(Convert.ToDecimal(objB, CultureInfo.CurrentCulture))); } else if ((objA is double || objA is float || objA is decimal) && (objB is double || objB is float || objB is decimal)) { return(MathUtils.ApproxEquals(Convert.ToDouble(objA, CultureInfo.CurrentCulture), Convert.ToDouble(objB, CultureInfo.CurrentCulture))); } #if (JSON_SmallDecSupport) else if (objA is SmallDec || objB is SmallDec) { string FullNameA = objA.GetType().FullName; string FullNameB = objA.GetType().FullName; SmallDec i1 = objA is SmallDec ? (SmallDec)objA : (FullNameA == "MS.Internal.NamedObject" ? SmallDec.Zero : SmallDec.Initialize(objA)); SmallDec i2 = objB is SmallDec ? (SmallDec)objB : (FullNameB == "MS.Internal.NamedObject" ? SmallDec.Zero : SmallDec.Initialize(objB)); return(i1 == i2); } #endif else { return(false); } } return(objA.Equals(objB)); }
private static bool Operation(ExpressionType operation, object objA, object objB, out object result) { if (objA is string || objB is string) { if (operation == ExpressionType.Add || operation == ExpressionType.AddAssign) { result = objA?.ToString() + objB?.ToString(); return(true); } } #if HAVE_BIG_INTEGER if (objA is BigInteger || objB is BigInteger) { if (objA == null || objB == null) { result = null; return(true); } // not that this will lose the fraction // BigInteger doesn't have operators with non-integer types BigInteger i1 = ConvertUtils.ToBigInteger(objA); BigInteger i2 = ConvertUtils.ToBigInteger(objB); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = i1 + i2; return(true); case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = i1 - i2; return(true); case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = i1 * i2; return(true); case ExpressionType.Divide: case ExpressionType.DivideAssign: result = i1 / i2; return(true); } } #if (JSON_SmallDecSupport) else if (objA is SmallDec || objB is SmallDec) { string FullNameA = objA.GetType().FullName; string FullNameB = objA.GetType().FullName; SmallDec i1 = objA is SmallDec?(SmallDec)objA : (FullNameA == "MS.Internal.NamedObject"?SmallDec.Zero:SmallDec.Initialize(objA)); SmallDec i2 = objB is SmallDec ? (SmallDec)objB : (FullNameB == "MS.Internal.NamedObject" ? SmallDec.Zero : SmallDec.Initialize(objB)); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = i1 + i2; return(true); case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = i1 - i2; return(true); case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = i1 * i2; return(true); case ExpressionType.Divide: case ExpressionType.DivideAssign: result = i1 / i2; return(true); } } #endif else #endif if (objA is ulong || objB is ulong || objA is decimal || objB is decimal) { if (objA == null || objB == null) { result = null; return(true); } decimal d1 = Convert.ToDecimal(objA, CultureInfo.InvariantCulture); decimal d2 = Convert.ToDecimal(objB, CultureInfo.InvariantCulture); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = d1 + d2; return(true); case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = d1 - d2; return(true); case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = d1 * d2; return(true); case ExpressionType.Divide: case ExpressionType.DivideAssign: result = d1 / d2; return(true); } } else if (objA is float || objB is float || objA is double || objB is double) { if (objA == null || objB == null) { result = null; return(true); } double d1 = Convert.ToDouble(objA, CultureInfo.InvariantCulture); double d2 = Convert.ToDouble(objB, CultureInfo.InvariantCulture); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = d1 + d2; return(true); case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = d1 - d2; return(true); case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = d1 * d2; return(true); case ExpressionType.Divide: case ExpressionType.DivideAssign: result = d1 / d2; return(true); } } else if (objA is int || objA is uint || objA is long || objA is short || objA is ushort || objA is sbyte || objA is byte || objB is int || objB is uint || objB is long || objB is short || objB is ushort || objB is sbyte || objB is byte) { if (objA == null || objB == null) { result = null; return(true); } long l1 = Convert.ToInt64(objA, CultureInfo.InvariantCulture); long l2 = Convert.ToInt64(objB, CultureInfo.InvariantCulture); switch (operation) { case ExpressionType.Add: case ExpressionType.AddAssign: result = l1 + l2; return(true); case ExpressionType.Subtract: case ExpressionType.SubtractAssign: result = l1 - l2; return(true); case ExpressionType.Multiply: case ExpressionType.MultiplyAssign: result = l1 * l2; return(true); case ExpressionType.Divide: case ExpressionType.DivideAssign: result = l1 / l2; return(true); } } result = null; return(false); }