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));
        }
Exemple #2
0
        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);
        }