Я понимаю, что ваш вопрос заключается в том, как можно сравнить два объекта на равенство значений (в отличие от ссылочного равенства) без предварительного знания типов, например, если они реализуют IEquatable или переопределяют Equals.
Для этого я рекомендую два варианта:
A. Используйте универсальный класс сериализации для сериализации обоих объектов и сравнения их значений. Например, у меня есть класс с именем XmlSerializer, который принимает любой объект и сериализует его открытые свойства как документ XML. В этом смысле два объекта, которые имеют одинаковые значения и, возможно, одну и ту же ссылку, будут иметь одинаковые значения.
B. Используя отражение, сравните значения всех свойств обоих объектов, например:
bool Equal(object a, object b)
{
// They're both null.
if (a == null && b == null) return true;
// One is null, so they can't be the same.
if (a == null || b == null) return false;
// How can they be the same if they're different types?
if (a.GetType() != b.GetType()) return false;
var Props = a.GetType().GetProperties();
foreach(var Prop in Props)
{
// See notes *
var aPropValue = Prop.GetValue(a) ?? string.Empty;
var bPropValue = Prop.GetValue(b) ?? string.Empty;
if(aPropValue.ToString() != bPropValue.ToString())
return false;
}
return true;
}
Здесь мы предполагаем, что мы можем легко сравнить свойства, например, если они все реализуют IConvertible, или правильно переопределить ToString. Если это не так, я бы проверил, реализуют ли они IConvertible, а если нет, рекурсивно вызовите Equal () для свойств.
Это работает, только если вы довольны сравнением общедоступных свойств. Конечно, вы МОЖЕТЕ также проверить частные и защищенные поля и свойства, но если вы так мало знаете об объектах, вы, вероятно, напрашиваетесь на неприятности, но делаете это.