2009-08-17 6 views
3

Ich möchte IEnumerable an eine Methode übergeben und eine Kopie von IEnumerable zurückgeben lassen. Ich möchte jedoch, dass jede in der Sammlung eine Kopie ist und nicht nur die Sammlung eine Kopie ist.Anonyme Typen klonen?

Ein Beispiel:

// some random data from L2S 
var data = (from p in sourceData 
      select new 
      { 
       a = 1, 
       b = "hello", 
      }).ToArray(); 

var dataCopy = data.Copy(); // somehow i want 'dataCopy' to be a deep copy of 'data' 

foreach (var d in dataCopy) 
{ 
    // alter the item in the collection somehow 
    d.b = d.b + "1"; 
} 

// combine both sets of data 
var finalData = data.Union(dataCopy); 

So ist die Sammlung ‚Finaldata‘ hat doppelt so viele Punkte wie ‚Daten‘ oder ‚Datacopy‘. Also haben alle 'b' Parameter in 'dataCopy' eine "1" an das Ende angehängt, aber da sie immer noch auf die Objekte in 'Daten' verweisen, haben alle 'b' Parameter in 'Daten' ALSO '1' angehängt Ende.

Da dies anonyme Typen sind, kann ich das Objekt nicht einfach mit der BinaryFormatter-Methode "klonen", da der anonyme Typ nicht serialisierbar ist. Und ich kann kein neues von Grund auf mit Activator.CreateInstance erstellen, da der anonyme Typ keinen parameterlosen Konstruktor hat.

Ich weiß, dass ich umgehen könnte, indem ich zunächst meine Daten in eine als Serializable markierte Klasse auswähle, aber ich möchte wirklich nicht so viel Code ändern müssen, da jedes Mal, wenn ich die Datenbank abfrage, die Parameter sein werden anders ...

Kann jemand alternativ einen Ersatz für den anonymen Typ empfehlen? zB:

var data = (from p in sourceData 
      select new SomeSortOfAnonymousTypeReplacement(new 
      { 
       a = 1, 
       b = "hello", 
      })).ToArray(); 

welche würde dann eine klonbare Schnittstelle implementieren? Diese

Antwort

1

Ich bin neugierig, was schätzen Sie denken, Sie aus Klonen des anonymen Typs erhalten wird. In C# sind alle anonymen Typen flach unveränderlich. Sie können geändert werden, indem die in der Instanz enthaltenen Werte geändert werden (z. B. durch Hinzufügen eines Werts zu einer Auflistung). Aber selbst das Erstellen einer flachen Kopie des Werts über einen Klon verhindert nicht, dass dieser Nebeneffekt in vorhandenen Instanzen sichtbar ist.

Der einzige Wert, den Klon für einen anonymen Typ haben könnte, ist, wenn Sie den Wert tief klonen. Das klont sowohl die Instanz des anonymen Typs als auch alle internen Werte rekursiv. Dies ist eine sehr teure Operation und wahrscheinlich nicht das, wonach Sie suchen.

Können Sie uns mehr Einblick geben in das, was Sie erreichen möchten? Es kann eine einfachere Lösung geben.