我有这堂课:
public class Person : ICloneable
{
public string FirstName { get; set; }
public string LastName { get; set; }
public object Clone()
{
return this;
}
}
扩展方法:
public static class MyHelper
{
public static IEnumerable<T> Clone<T>(this IEnumerable<T> collection) where T : ICloneable
{
return collection.Select(item => (T)item.Clone());
}
}
我想在这种情况下使用它:
var myList = new List<Person>{
new Person { FirstName = "Dana", LastName = "Scully" },
new Person{ FirstName = "Fox", LastName = "Mulder" }
};
List<Person> myCopy = myList.Clone().ToList<Person>();
当我在“immediat窗口”中更改myCopy
的值时,orginial列表也会发生变化。
我希望两个列表完全独立
我错过了什么?
答案 0 :(得分:3)
您对Clone
的实施是错误的。
试试这个:
public object Clone()
{
return MemberwiseClone();
}
答案 1 :(得分:1)
您的clone方法返回相同的对象。
你应该像这样实现它
public class Person : ICloneable
{
public string FirstName { get; set; }
public string LastName { get; set; }
public object Clone()
{
return new Person { FirstName = this.FirstName, LastName = this.LastName };
}
}
答案 2 :(得分:1)
除了Clone
课程中Person
方法的问题,您还需要在扩展方法中返回新列表
return collection.Select(item => (T)item.Clone()).ToList();
这是因为Select
方法来自Linq,它使用延迟执行。如果您更改原始列表,则“myCopy”列表也将更改。