【发布时间】:2014-06-13 17:59:44
【问题描述】:
我有一些代码可以让我与实体框架实体进行比较。
但是,我注意到它有时返回 false(不匹配),而实际上它是 true(从逻辑角度来看)。
由于 HashSets 而失败 - 比较时它们总是返回 false。 HashSet 通常是指向我不需要比较的其他实体的导航链接。
我可以对此代码进行任何修改以使其正常工作吗?
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;
}
}
}
【问题讨论】:
-
你必须使用 IEqualityComparer
-
所以你必须找到一种方法从比较中排除 HashSet。这应该不会太难。
-
@IamStalker - 你愿意详细说明吗?
-
@GertArnold - 你有什么建议吗?
标签: c# asp.net entity-framework poco iequalitycomparer