Porownywanie list zawierajacych typy referencyjne

0

Czesc. Mam male watpliwosci i prosilbym o wyjasnienie ich.
Posiadam:
Obiekt B, ktory jest gleboka kopia Obiektu A.
Zrobilem to przez utworzenie Obiektu B i kopiowanie odpowiednio kazdej wlasciwosci z Obiektu A.
Nastepnie chce w testach jednostkowych sprawdzic czy aby na pewno sie udalo. (Przegladanie debuggera wskazuje, ze tak)
I tutaj powstaje problem. Jak porownac typy referencyjne, gdzie porownuje sie ich referencje, a nie wartosci? Najwiekszym problemem jest lista.
List<Klasa z ktorej wywodzi sie A oraz B> .
Czyli lista mogaca zawierac inne obiekty tej samej klasy, a one z kolei zawieraja kolejne.

Sprawdzanie obiektow polega na przejsciu po kazdej wlasciwosci (od intow, przez tablice itp.) i porownaniu z tymi w drugim obiekcie.
Jesli to cokolwiek zmienia to kod w testach dziala w wiekszosci na refleksjach (wszystko zamyka sie w jednej petli iterujacej po kazdej wlasciwosci

Wpadlem na takie rozwiazanie:

if(ListA.Count == ListaB.Count)
{
  for(int i = 0; i < ListaA.Count; i++)
{
 if(ListaA[i].ToString() != ListaB[i].ToString())
 Assert>False()
} 
}

Zastanawiam sie czy takie rozwiazanie jest malo eleganckie i raczej powinienem szukac czegos innego, czy moze byc, bo przeciez dziala.
Jesli ilosc obiektow w liscie sie zgadza oraz ich nazwy[konkretnych obiektow w liscie] to jest OK.
Jesli rozwiazanie jest beznadziejne, a macie jakies pomysly to rowniez prosilbym o rady.
P.S. Wyczytalem o nadpisaniu Equal itp. ale wszystko wydaje sie sprowadzac do tego samego.

0

Nie wiem czy dobrze rozumiem, bardzo chaotycznie piszesz.

class Obiekt1
int Prop1;
string Prop2;

class Obiekt2
int Prop1
DateTime Prop2;

Biorąc pod uwagę mój przykład, chcesz porównać czy własność Prop1 klasy Obiekt1 jest tego samego typu co Prop1 klasy Obiekt2?

1
Nitoken napisał(a):

Jak porownac typy referencyjne, gdzie porownuje sie ich referencje, a nie wartosci?

https://msdn.microsoft.com/en-us/library/system.object.referenceequals(v=vs.110).aspx

0
var napisał(a):
Nitoken napisał(a):

Jak porownac typy referencyjne, gdzie porownuje sie ich referencje, a nie wartosci?

https://msdn.microsoft.com/en-us/library/system.object.referenceequals(v=vs.110).aspx

Poza tym operator == domyślnie tak działa. Więc jeśli masz obiekty referencyjne, w których nie nadpisujesz operatora ==, to on zadziała w taki sposób, że sprawdza referencje (na najniższym poziomie wywołuje ReferenceEquals).

0
Nitoken napisał(a):

Zastanawiam sie czy takie rozwiazanie jest malo eleganckie i raczej powinienem szukac czegos innego, czy moze byc, bo przeciez dziala.

Działa? Czyli nie ma znaczenia, co obiekt zawiera, ważne żeby nazwa klasy była taka sama?
To po co ta cała refleksja?

0

Na pocztku najmocniej przepraszam. Wkradl sie powazny blad, poniewaz pisalem posta na szybko.
Chodzilo mi o o sprawdzenie typu referencyjnego pod katem jego wartosci, a nie referencji.
Jesli chodzi o referencje to zarowno Equals, ReferenceEquals oraz operator == sprawuje sie swietnie.
Dziekuje za obecnie dodane odpowiedzi.
Z tego co widze nie mam mozliwosci edycji mojego postu.

1

No to zamiast wynajdować koło na nowo, najprościej użyć istniejącego rozwiązania jak np. FluentAssertions i metody ShouldBeEquivalentTo. W ten sposób porównasz cały graf obiektów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1