2012-07-31 27 views
1

我有這個類:深名單<T>的副本擴展方法

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

爲什麼你使用'ICloneable'接口?這個接口是無用的:http://stackoverflow.com/questions/536349/why-no-icloneablet。 – Steven 2012-07-31 07:13:13

回答

3

你實現Clone是錯誤的。您Person類內部與Clone方法

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

haaa你comptely正確:) – 2012-07-31 06:54:44

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 }; 
    } 
} 
1
從問題

除了你需要在你的擴展方法返回一個新的列表也

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

這是因爲Select

試試這個方法來自使用延遲執行的Linq。如果您更改原始列表,那麼'myCopy'列表也將更改。