コード例 #1
0
        /// <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);
        }