Вы боретесь против определения C # равенства объектов, так что это проигрышная битва.Вам неизбежно нужно определить равенство объектов для каждого из ваших классов.Но это можно сделать с небольшим трудом - вы определяете его в базовом классе и наследуете.
Давайте определим 2 класса:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Product2 : DomainEntityIntPK
{
public string Name { get; set; }
}
В этом случае я бы вывел все свои "бизнес-сущность "классы от DomainEntityIntPK.Это класс, который занимается концепцией равенства бизнеса.
Вот модульные тесты и результаты:
[TestFixture]
public class UnitTest1
{
[Test]
public void TestMethodProduct()
{
Product p1 = new Product{ Id=1, Name="Foo" };
Product p2 = new Product{ Id=1, Name="Foo" };
Assert.AreEqual( p1, p2 );
}
[Test]
public void TestMethodProduct2()
{
Product2 p1 = new Product2{ Id=1, Name="Foo" };
Product2 p2 = new Product2{ Id=1, Name="Foo" };
Assert.AreEqual( p1, p2 );
}
}
А отсутствующим элементом, конечно же, является базовый класс:
public abstract class DomainEntityIntPK
{
public int Id { get; set; }
public static bool operator ==( DomainEntityIntPK lhs, DomainEntityIntPK rhs )
{
return Equals( lhs, rhs );
}
public static bool operator !=( DomainEntityIntPK lhs, DomainEntityIntPK rhs )
{
return !Equals( lhs, rhs );
}
public override Boolean Equals( object obj )
{
DomainEntityIntPK other = obj as DomainEntityIntPK;
if( other == null ) return false;
Boolean thisIsNew = Id == 0;
Boolean otherIsNew = other.Id == 0;
if( thisIsNew && otherIsNew )
{
Boolean referenceEquals = ReferenceEquals( this, other );
return referenceEquals;
}
Boolean idEquals = Id.Equals( other.Id );
return idEquals;
}
}