用于创建集合中所有元素的深层副本的通用方法

bwa*_*ner 8 c# generics

我有各种不同对象类型的ObservableCollections.我想编写一个方法来获取任何这些对象类型的集合,并返回一个新集合,其中每个元素都是给定集合中元素的深层副本.以下是特定类的示例

   private static ObservableCollection<PropertyValueRow> DeepCopy(ObservableCollection<PropertyValueRow> list)
   {
        ObservableCollection<PropertyValueRow> newList = new ObservableCollection<PropertyValueRow>();
        foreach (PropertyValueRow rec in list)
        {
            newList.Add((PropertyValueRow)rec.Clone());
        }
        return newList;
   }
Run Code Online (Sandbox Code Playgroud)

如何为任何实现ICloneable的类使这个方法通用?

Jon*_*eet 25

你可以这样做:

private static ObservableCollection<T> DeepCopy<T>(ObservableCollection<T> list)
    where T : ICloneable
{
   ObservableCollection<T> newList = new ObservableCollection<T>();
   foreach (T rec in list)
   {
       newList.Add((T)rec.Clone());
   }
   return newList;
}
Run Code Online (Sandbox Code Playgroud)

请注意,通过采用可以使这更通用IEnumerable<T>,LINQ使它更容易:

private static ObservableCollection<T> DeepCopy<T>(IEnumerable<T> list)
    where T : ICloneable
{
   return new ObservableCollection<T>(list.Select(x => x.Clone()).Cast<T>());
}
Run Code Online (Sandbox Code Playgroud)