December 13, 2012

Codeplex library to compare .NET objects

Codeplex library to compare .NET objects can be found here
Here is a sample usage of the ObjectCompare class:
// An equality comparator for XXX. Uses a 3rd party ObjectComparer utility class.
// Objects are considered equal if all their public properties and fields are equal
// UNUSUALLY ReferenceEquals fails when the 2 references are equal
// We should not be comparing the same objects in these
// tests
static bool XXXsAreEqual(XXX ds1, XXX ds2, List<string> elementsToIgnore = null)
{
    // Check for null values
    if (ds1 == null)
    {
        return (ds2 == null);
    }
    else if (ds2 == null)
    {
        return false;
    }

    // Check for NOT reference equals
    if (object.ReferenceEquals(ds1, ds2))
        return false; // This should NOT happen in these unit tests, fail if it does!

    // compare run-time types.
    if (ds1.GetType() != ds2.GetType())
        return false;

    // Ensure all public non-static properties and fields are equal
    var objectComparator = new ObjectCompare();
    objectComparator.CompareStaticFields = false;
    objectComparator.CompareStaticProperties = false;
    objectComparator.ComparePrivateProperties = false;
    objectComparator.ComparePrivateFields = false;
    objectComparator.CompareFields = true;
    objectComparator.CompareChildren = true;
    objectComparator.CompareReadOnly = true;
    objectComparator.CompareProperties = true;
    objectComparator.Caching = true;
    objectComparator.AutoClearCache = true;
    objectComparator.IgnoreObjectTypes = false; // Already done this above
    objectComparator.MaxDifferences = 1;
    objectComparator.ElementsToIgnore = elementsToIgnore ?? 
                                                new List<string>();

    bool res = objectComparator.Compare(ds1, ds2);
    // If this method fails, check the cause here!
    List<string> causeOfFailure = objectComparator.Differences; 
    if (causeOfFailure.Count > 0)
    {
        Debug.Write("Equality failure caused by following properties/fields: ");
        string failedOn = string.Join(", ", causeOfFailure.ToArray());
        Debug.WriteLine(failedOn);
    }
    return res;
}
To convert this to an equals operator of some kind you would have to fix the reference equals part to return true when the 2 references are equal.

No comments: