需在類別與欄位標記 [Serializable] 屬性。透過 BinaryFormatter 序列化至記憶體流再反序列化,可獲得完整獨立副本。
利用 Activator.CreateInstance 建立新實例,再透過 PropertyInfo.GetValue/SetValue 逐屬性複製。可搭配自訂屬性控制拷貝行為:
public class Person
{
private List<Person> _friends = new List<Person>();
public string Firstname { get; set; }
public string Lastname { get; set; }
[Cloneable(CloneableState.Exclude)]
[Cloneable(CloneableState.Include, "Friends")]
public List<Person> Friends { get { return _friends; } }
[Cloneable(CloneableState.Exclude)]
public PersonManager Manager { get; set; }
}
此方式不需序列化,效能較佳,且可精細控制哪些欄位深拷貝、哪些淺拷貝或排除。
參考類型預設為淺拷貝(複製參考),若需獨立物件圖則需深拷貝。語言未內建深拷貝,留給開發者依需求實作。