/// <summary> /// <para>Сравнение двух объектов, путем сравнения значений каждого поля объета.</para> /// <para>Проверяются только public поля.</para> /// </summary> public static bool IsFieldsEquals(this object self, object obj, bool ignoreNull = false) { if (self == null && obj == null) { return(true); } if (self == null || obj == null) { return(false); } var res = self.Equals(obj); if (self.IsPrimitiveType() || obj.IsPrimitiveType()) { return(res); } if (!res) { res = true; Type T1 = self.GetType(); Type T2 = obj.GetType(); var PL1 = T1.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); var PL2 = T2.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); object V1; object V2; foreach (var P1 in PL1) { V1 = P1.GetValue(self); if (ignoreNull && V1 == null) { continue; } if (T1 == T2) { V2 = P1.GetValue(obj); } else { V2 = V1; foreach (var P2 in PL2) { if (P2.Name == P1.Name) { V2 = P2.GetValue(obj); break; } } } res = V1.IsFieldsEquals(V2); if (!res) { break; } } } return(res); }