public static bool ReflectionEquals(object lhs, object rhs, bool testTransients, Type reflectUpToClass) { if (lhs == rhs) { return(true); } if (lhs == null || rhs == null) { return(false); } var lhsClass = lhs.GetType(); var rhsClass = rhs.GetType(); Type testClass; if (lhsClass.IsInstanceOfType(rhs)) { testClass = lhsClass; if (!rhsClass.IsInstanceOfType(lhs)) { testClass = rhsClass; } } else if (rhsClass.IsInstanceOfType(lhs)) { testClass = rhsClass; if (!lhsClass.IsInstanceOfType(rhs)) { testClass = lhsClass; } } else { return(false); } var equalsBuilder = new EqualsBuilder(); try { ReflectionAppend(lhs, rhs, testClass, equalsBuilder, testTransients); while (testClass.BaseType != null && testClass != reflectUpToClass) { testClass = testClass.BaseType; ReflectionAppend(lhs, rhs, testClass, equalsBuilder, testTransients); } } catch (ArgumentException e) { return(false); } return(equalsBuilder.IsEquals()); }