This question already has answers here:
How do I create and access a new instance of an Anonymous Class passed as a parameter in C#?
                                
                                    (4个答案)
                                
                        
                                去年关闭。
            
                    
我想做的是将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();


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

最佳答案

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

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

您能否使我们对要完成的工作有更多的了解?可能有一个更简单的解决方案。

关于c# - 克隆匿名类型? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1285858/

10-09 08:48