2009-08-17 8 views
3

Ce que je veux faire est de passer IEnumerable à une méthode et lui faire retourner une copie de IEnumerable. Cependant, je veux que chacun de la collection soit une copie plutôt qu'une simple copie.Types clonés anonymes?

Un exemple:

// 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); 

Ainsi, la collection 'FinalData' a deux fois plus d'articles que 'données' ou 'Datacopy'. Donc, tous les paramètres 'b' dans 'dataCopy' ont "1" ajouté à la fin, mais comme ils référencent toujours les objets dans 'data', tous les paramètres 'b' dans 'data' ont aussi "1" ajouté au fin.

Comme ce sont des types anonymes, je ne peux pas simplement 'cloner' l'objet en utilisant la méthode BinaryFormatter, car le type anonyme n'est pas sérialisable. Et je ne peux pas créer un nouveau à partir de zéro en utilisant Activator.CreateInstance car le type anonyme n'a pas de constructeur sans paramètre. Je réalise que je pourrais contourner ce problème en sélectionnant mes données dans une classe marquée comme sérialisable, mais je ne veux vraiment pas avoir à modifier autant de code puisque chaque fois que j'interroge la base de données, les paramètres seront différent ...

Sinon, quelqu'un pourrait-il recommander un remplacement pour le type anonyme? par exemple:

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

qui implémenterait alors une interface clonable?

Répondre

1

Je suis curieux de savoir quelle valeur vous pensez que vous sortirez du clonage du type anonyme. En C#, tous les types anonymes sont faiblement immuables. Ils peuvent être modifiés en modifiant les valeurs contenues dans l'instance (par exemple en ajoutant une valeur à une collection). Mais même créer une copie superficielle de la valeur via un clone n'empêchera pas cet effet secondaire d'être visible dans les instances existantes.

La seule valeur que Clone pourrait avoir sur un type anonyme est si vous clonez profondément la valeur. C'est à la fois cloner l'instance de type anonyme et toutes ses valeurs internes de manière récursive. C'est une opération très coûteuse et n'est probablement pas ce que vous cherchez.

Pouvez-vous nous donner plus de détails sur ce que vous essayez d'accomplir? Il peut y avoir une solution plus facile.

Questions connexes