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?