C# 列表的深度副本<;T>;用可拓方法

C# 列表的深度副本<;T>;用可拓方法,c#,extension-methods,clone,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 IEnumer

我有这门课:

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());
    }
}
公共静态类MyHelper
{
公共静态IEnumerable克隆(此IEnumerable集合),其中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>();
var myList=新列表{
新人{FirstName=“Dana”,LastName=“Scully”},
新人{FirstName=“Fox”,LastName=“Mulder”}
};
List myCopy=myList.Clone().ToList();
当我在“即时窗口”中更改
myCopy
的值时,原始列表也会发生更改

我想要两个完全独立的列表


我遗漏了什么?

克隆方法返回相同的对象

您应该这样实现它

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 };
    }
}

克隆方法返回相同的对象

您应该这样实现它

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 };
    }
}

您对克隆的实现是错误的

试试这个:

public object Clone()
{
    return MemberwiseClone();
}

您对克隆的实现是错误的

试试这个:

public object Clone()
{
    return MemberwiseClone();
}

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

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

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

除了
Person
类中的
克隆
方法存在问题外,您还需要在扩展方法中返回新列表

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

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

为什么要使用
ICloneable
界面?此接口无效:。为什么要使用
ICloneable
接口?此接口无效:。