ValeraT1982 / ObjectsComparer

C# Framework provides mechanism to compare complex objects, allows to override comparison rules for specific properties and types.
MIT License
352 stars 86 forks source link

Expected result is wrong in case of List<dynamic> #52

Closed Raghvendra0105 closed 1 year ago

Raghvendra0105 commented 1 year ago
 public class CompareTest
    {
        public void AddMember()
        {
            List<dynamic> List1 = new List<dynamic>();
            Person Person1 = new Person();
            Person1.Name = "Hari";
            Person1.Age = "21";
            List1.Add(Person1);

            List<dynamic> List2 = new List<dynamic>();
            Person Person2 = new Person();
            Person2.Name = "Gary";
            Person2.Age = "21";
            List2.Add(Person2);

            List<string> DiffPath = new List<string>();
            var comparer = new ObjectsComparer.Comparer();

            ////Compare objects
            IEnumerable<Difference> differences;

            var isEqual = comparer.Compare(List1, List2, out differences);

        }

In the above code, isEqual returned true so no differences were found. But the Name is different for the two objects. List1 and List2 are dynamic types. Am I missing something?

Cheers!

ValeraT1982 commented 1 year ago

Hi. It's actually an expected behavior. ObjectsComparer uses object type to get a list of members to compare. You specify both lists as dynamic, so comparer comparers objects as dynamics (code to get members to compare), but the actual type of the objects is Person (which I assume is not inherited from dynamic).

The following 2 tests pass


[Test]
public void DifferencesInDynamicList()
{
    var list1 = new List<dynamic>();
    dynamic person1 = new DynamicDictionary();
    person1.Name = "Hari";
    person1.Age = "21";
    list1.Add(person1);

    var list2 = new List<dynamic>();
    dynamic person2 = new DynamicDictionary();
    person2.Name = "Gary";
    person2.Age = "21";
    list2.Add(person2);

    var comparer = new ObjectsComparer.Comparer();

    var isEqual = comparer.Compare(list1, list2);

    Assert.IsFalse(isEqual);
}
`

[Test]
public void DifferencesInTypedList()
{
    var list1 = new List<Person>();
    dynamic person1 = new Person();
    person1.Name = "Hari";
    person1.Age = "21";
    list1.Add(person1);

    var list2 = new List<Person>();
    dynamic person2 = new Person();
    person2.Name = "Gary";
    person2.Age = "21";
    list2.Add(person2);

    var comparer = new ObjectsComparer.Comparer();

    var isEqual = comparer.Compare(list1, list2);

    Assert.IsFalse(isEqual);
}