克隆匿名类型?

时间:2009-08-17 01:46:45

标签: c# clone anonymous-types

我想要做的是将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'的项目数量是'data'或'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();

然后实现可克隆的接口?

1 个答案:

答案 0 :(得分:1)

我很好奇你认为克隆匿名类型会有什么价值。在C#中,所有匿名类型都是浅不可变的。可以通过改变实例中包含的值(例如向集合中添加值)来更改它们。但即使通过克隆创建值的浅表副本也不会阻止此副作用在现有实例中可见。

克隆在匿名类型上可能具有的唯一价值是,如果您深度克隆该值。这是以递归方式克隆匿名类型实例及其所有内部值。这是一项非常昂贵的操作,可能不是您想要的。

您能否让我们更深入地了解您想要实现的目标?可能有一个更简单的解决方案。