Простое сравнение свойств двух объектов в C #

У меня есть класс с множеством свойств. Неглубокой копии достаточно, чтобы полностью воспроизвести объект.

Мне нужно сравнить объект, чтобы проверить, содержит ли он точно такие же значения, что и другой.

Мои идеи:

Первое и наиболее очевидное решение - просто создать огромный блок методов, который сравнивает каждое свойство одно за другим.

Второй - сериализовать каждый объект и хэшировать файл или вычислить для него некую контрольную сумму md5. (Будет ли это действительно работать?)

Третий - сделать своего рода отражение на объекте, что автоматизирует первый вариант, но создаст дополнительный уровень сложности.

Скорость на самом деле не проблема.

Мне интересно услышать мысли или какие-либо другие методы, которые мне не хватает, чтобы сделать это.

Редактировать: Спасибо всем. Мое решение (теперь рекурсивно для общих элементов):

public static bool IsSame<T>(T objA, T objB)
{
    var type = typeof(T);
    var properties = type.GetProperties();
    foreach (var pi in properties.Where(a => a.CanRead))
    {
        if (pi.Name == "Item")
        {
            var piCount = properties.FirstOrDefault(a => a.Name == "Count");
            int count = -1;
            if (piCount != null && piCount.PropertyType == typeof(System.Int32))
                count = (int)piCount.GetValue(objA, null);
            if (count > 0)
            {
                for (int i = 0; i < count; i++)
                {
                    dynamic child1 = pi.GetValue(objA, new object[] { i });
                    dynamic child2 = pi.GetValue(objB, new object[] { i });
                    return IsSame(child1, child2);
                }
            }
        }
        else
        {
            var val1 = type.GetProperty(pi.Name).GetValue(objA, null);
            var val2 = type.GetProperty(pi.Name).GetValue(objB, null);
            if (val1 != val2 && (val1 == null || !val1.Equals(val2)))
                return false;
        }
    }
    return true;
}
5
задан CarenRose 11 December 2019 в 20:26
поделиться