public override bool Equals(object actual) { if (actual == null) { return(true); } Assert.AreEqual(_expected.GetType(), actual.GetType()); PropertyInfo[] properties = _expected.GetType().GetProperties(); foreach (PropertyInfo property in properties) { if (_ignores.Contains(property.Name)) { continue; } if (property.GetIndexParameters().Length > 0) { continue; } if (property.PropertyType.IsAssignableFrom(typeof(ICollection))) { continue; } if (!property.CanRead) { continue; } Debug.WriteLine("Comparing Property " + property.Name); object expectedValue = property.GetValue(_expected, null); object actualValue = property.GetValue(actual, null); if (expectedValue != null) { if (expectedValue.GetType().IsValueType) { Assert.AreEqual(expectedValue, actualValue, property.Name); } else { var childConstraint = new EqualConstraint(expectedValue); childConstraint._ignores = _ignores; childConstraint.Equals(actualValue); } } } return(true); }