使用扩展方法</t>的List <t>的深层副本

时间:2012-07-31 06:49:07

标签: c# extension-methods clone

我有这堂课:

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列表也会发生变化。

我希望两个列表完全独立

我错过了什么?

3 个答案:

答案 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”列表也将更改。