2016-04-05 3 views
1

Ich habe ein Array und Typ wie;ToArray() Methode klont alle Instanzen als letzte

List<ContractListType> ContractsList = new List<ContractListType>(); 
ContractListType instance = new ContractListType(); 

Ich füge 4 Elemente meiner ContractsList 4 von

If a == 1 
    instance.name = "A" 
    ContractsList.Add(instance); 
If b == 1 
    instance.name = "B" 
    ContractsList.Add(instance); 
If c == 1 
    instance.name = "C" 
    ContractsList.Add(instance); 
If d == 1 
    instance.name = "D" 
    ContractsList.Add(instance); 

Und schließlich möchte ich mit Antwort meiner Liste übereinstimmen.

response.GetContractListResponse.GetContractListResponseDTO.ContractListType = ContractsList.ToArray(); 

Obwohl a = 1, b = 2, c = 3, d = 4; meine Antwort kommt wie

<name>D</name> 
<name>D</name> 
<name>D</name> 
<name>D</name> 

Wenn ich debuggen, bevor Antwort, die ich alle Namen in conractsList sehen kann, aber wenn ToArray läuft, alle Namen zu „D“ umwandeln, die letzte ist.

Ich konnte keine Lösung finden. Hilf mir bitte.

Antwort

4

Mit .NET/C# fügen Sie nicht das Objekt selbst der Liste hinzu, sondern den Verweis auf das Objekt. Ihr Code fügt 4 Mal die gleiche Referenz hinzu und ändert die Referenz. Sie müssen das Objekt klonen und seine Eigenschaft ändern, bevor Sie es zur Liste hinzufügen, um das gewünschte Ergebnis zu erzielen.

Versuchen Sie dieses Muster.

If a == 1 
    ContractsList.Add(new ContractListType{ name = "A" }); 

MSDN bietet ein schönes Beispiel für implementing a Deep copy of your object.

+0

Ich sehe Sie, aber nicht wissen, wie man Objekt klonen und seine Eigenschaft vor dem Hinzufügen zu Liste ändern. Kannst du bitte ein Beispiel geben? – Gyepesto

+0

Erstellen Sie einen neuen Konstruktor, der einen Parameter des gleichen Typs aufnimmt und über die Eigenschaften kopiert. Beachten Sie, dass Eigenschaften, die Referenztypen (Klassen) sind, auch eigene Klone benötigen. –

+0

@Gyepesto gibt es keine generische Möglichkeit, ein Objekt in .NET zuverlässig zu klonen. Normalerweise müssen Sie eine benutzerdefinierte '.Clone()' Methode im Objekt bereitstellen oder sie manuell an der Stelle rekonstruieren, an der Sie sie benötigen, wie Babak gezeigt hat (die '.Clone()' Methode enthält normalerweise nur den Code, den Sie gemacht hätten die "von Hand" -Methode und nur das resultierende "neue" Objekt zurückgeben.). –