在C#中,如果我有IList
,并且我不知道IList
中对象的类型,我该如何创建IList
的副本?
情况如下:
我有一个CollectionEditor,可以修改IList
中的项目。如果按下取消按钮,我需要在更改项目之前恢复IList
。
答案 0 :(得分:6)
这里有两个不同的问题。将列表复制到另一个列表相对容易 - 如果您不需要第二个列表是完全相同类型的具体列表,则可以使用ToList()
,否则您只能在循环中Add
。但是,不会解决您的问题,除非此处T
是不可变的。它适用于string
,int
等,但将引用复制到复杂类型将无法恢复列表,因为单个项可能已被编辑在UI中。要解决那个问题,你需要一个“深层复制”(或者有一些其他策略,但这是最简单的)。正如已经指出的那样:执行深层复制的一种方法是:序列化。通过以XML,json或其他一些序列化格式获取数据的快照,可以通过“反序列化”实现“恢复”。
当然,如果您的T
内置了深度克隆方法,您可以使用它而不是序列化。 ICloneable
是深层还是浅层是不明确的,所以我认为坚持where T : ICloneable
是不够的。
答案 1 :(得分:1)
ToList创建一个副本:
IList x = y.ToList();