У меня есть класс с большим количеством свойств.Для полной репликации объекта достаточно мелкой копии.
Мне нужно сравнить объект, просто чтобы проверить, содержит ли он точно такие же значения, как и другой.
Мои идеи:
Первое и наиболее очевидное решение - просто создать огромный блок методов, который сравнивает каждое свойство, одно за другим.
Вторым было бы сериализовать каждый объект и хешировать файл или выполнить какое-то 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;
}