ich eine PagedModel Klasse haben, die IEnumerable implementiert, um nur die ModelData zurückkehren, ohne auf die Paging-Daten. Ich habe auch Equals und GetHashCode überschrieben, um den Vergleich von zwei PagedModel-Objekten mit ihren ModelData, PageNumber und TotalPages sowie PageSize zu ermöglichen.Assert.AreEqual nicht meine .Equals Überschreibungen auf einer IEnumerable-Implementierung verwenden
Hier ist das Problem
Dim p1 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
Dim p2 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
p1.Equals(p2) =====> True
Assert.AreEqual(p1, p2) ======> False!
Es ist wie NUnit aussieht wird es interne EnumerableEqual Methode ruft meinen PagedModel ist anstelle der Verwendung der Methoden vergleichen Equals I zur Verfügung gestellt! Gibt es eine Möglichkeit, dieses Verhalten zu überschreiben, oder muss ich eine benutzerdefinierte Assertion schreiben?
Was diese Antwort sagt ist, dass Sie im Wesentlichen in Ihrer Implementierung IEquatable .Equals implementieren müssen ... siehe http://stackoverflow.com/questions/1577149/explicit-interface-implementation-in-vb-net –
Jay
Nein, die Implementierung von IEquatable ist nicht genug. Die GetHashCode-Implementierung ist genauso wichtig. Es ist auch wichtig zu verstehen, dass IEnumerable auf die Verwendung von Equals (Objekt) zurückgreift, wenn IEquatable nicht implementiert wird (siehe das Zitat in meinem Beitrag), also ist dies nicht unbedingt erforderlich. –
csauve
Ich sagte explizit IEquatable.Equals zu implementieren, die das Standard-Fallback nicht zulassen sollte, da die Methode überschrieben werden würde und die explizit Implementierung würde diese Methode aufrufen ... – Jay