POCO比较器无法正常工作

时间:2014-04-28 09:06:21

标签: c# asp.net entity-framework poco iequalitycomparer

我有一些代码可以让我与实体框架实体进行比较。

但是,我注意到它有时会返回false(不匹配),而实际上它是真的(从逻辑角度来看)。

由于HashSets而失败 - 它们在比较时总是返回false。 HashSets通常是指向我不需要比较的其他实体的导航链接。

我可以对此代码进行任何修改以使其正常工作吗?

namespace Common.Helper
{
    public sealed class PocoHelper<TPOCO> : IEqualityComparer<TPOCO> where TPOCO : class
    {
        public bool Equals(TPOCO poco1, TPOCO poco2)
        {
            var t = typeof(TPOCO);

            if (poco1.IsNotNull() && poco2.IsNotNull())
            {
                bool areSame = true;

                foreach(var property in typeof(TPOCO).GetPublicProperties())
                {
                    object v1 = property.GetValue(poco1, null);
                    object v2 = property.GetValue(poco2, null);

                    if (!object.Equals(v1, v2))
                    {
                        areSame = false;
                        break;
                    }
                };

                return areSame;
            }

            return poco1 == poco2;
        }   

        public int GetHashCode(TPOCO poco)
        {
            int hash = 0;
            foreach(var property in typeof(TPOCO).GetPublicProperties())
            {
                object val = property.GetValue(poco, null);
                hash += (val == null ? 0 : val.GetHashCode());
            };
            return hash;
        }  
    } 
}

1 个答案:

答案 0 :(得分:-1)

当您比较的任何或两个对象都为空时,您应该返回false。

        if (poco1.IsNotNull() && poco2.IsNotNull())
        {
            bool areSame = true;

            foreach(var property in typeof(TPOCO).GetPublicProperties())
            {
                object v1 = property.GetValue(poco1, null);
                object v2 = property.GetValue(poco2, null);

                if (!object.Equals(v1, v2))
                {
                    areSame = false;
                    break;
                }
            };

            return areSame;
        } else {
            return false;
        }

因为在msdn上给出你的“==”会返回true

    // Returns true.
    Console.WriteLine("null == null is {0}", null == null);

您可以在http://msdn.microsoft.com/en-gb/library/edakx9da.aspx

查看

关于hashsets: HashSet的对象类型不必实现IEqualityComparer,而只需重写Object.GetHashCode()和Object.Equals(Object obj)。您可以在How does HashSet compare elements for equality?

看到完整的帖子