1

我有这门课:

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>();

当我在“即时窗口”中更改 的值时myCopy,原始列表也发生了变化。

我希望两个列表都完全独立

我错过了什么?

4

3 回答 3

3

你的实现Clone是错误的。

尝试这个:

public object Clone()
{
    return MemberwiseClone();
}
于 2012-07-31T06:52:19.203 回答
1

除了类中方法的问题之外,您ClonePerson需要在扩展方法中返回一个新列表

return collection.Select(item => (T)item.Clone()).ToList();

这是因为该Select方法来自使用延迟执行的 Linq。如果您更改原始列表,则“myCopy”列表也会更改。

于 2012-07-31T06:54:13.350 回答
1

您的克隆方法返回相同的对象。

你应该像这样实现它

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 };
    }
}
于 2012-07-31T06:50:20.683 回答