我想要做的是将IEnumerable传递给一个方法,并让它返回一个IEnumerable的副本。但是,我希望集合中的每一个都是副本,而不仅仅是集合的副本。克隆匿名类型?
一个例子:
// 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);
所以收集 'FinalData的' 有两倍多的项目, '数据' 或 'dataCopy'。因此,'dataCopy'中的所有'b'参数都在末尾附加了“1”,但由于它们仍然引用'data'中的对象,所以'data'中的所有'b'参数也都有“1”结束。
因为这些都是匿名类型,所以我不能简单地使用BinaryFormatter方法'克隆'对象,因为匿名类型是不可序列化的。而且我无法使用Activator.CreateInstance从头创建一个新的,因为匿名类型没有无参数的构造函数。
我意识到我可以通过最初选择我的数据到标记为Serializable的类中来解决这个问题,但是我真的不想修改那么多的代码,因为每次查询数据库时,参数都会不同的...
或者,任何人都可以推荐替代匿名类型?例如:
var data = (from p in sourceData
select new SomeSortOfAnonymousTypeReplacement(new
{
a = 1,
b = "hello",
})).ToArray();
然后它会实现一个可复制的接口?