【问题标题】:Cloning Anonymous Types? [duplicate]克隆匿名类型? [复制]
【发布时间】:2009-08-17 01:46:44
【问题描述】:

我想要做的是将 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 从头开始​​创建一个新的,因为匿名类型没有无参数构造函数。

我意识到我可以通过最初将我的数据选择到标记为可序列化的类中来解决这个问题,但我真的不想修改那么多代码,因为每次查询数据库时,参数都会有所不同...

或者,任何人都可以推荐匿名类型的替代品吗?例如:

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

然后哪个会实现一个可克隆的接口?

【问题讨论】:

标签: c# clone anonymous-types


【解决方案1】:

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

Clone 对匿名类型的唯一值是您深度克隆该值。那就是递归地克隆匿名类型实例及其所有内部值。这是一项非常昂贵的操作,可能不是您想要的。

您能否让我们更深入地了解您想要完成的工作?可能有更简单的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2011-08-07
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多