So klonen Sie Objekte, die eine IList-Eigenschaft enthalten, mit AutoMapper

Ich versuche, die folgende Klasse mit AutoMapper zu klonen:

public class MainData
{
    public MainData()
    {
        Details = new List<Detail>();
    }

    public int Id { get; private set; }
    public DateTime LastUpdate { get; private set; }
    public IList<Detail> Details { get; private set; }
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }

    public void AddDetail(Detail detail)
    {
        Details.Add(detail);
    }

    public void RemoveDetail(Detail detail)
    {
        Details.Remove(detail);
    }

    public MainData Clone()
    {
        Mapper.Reset();
        Mapper.CreateMap<MainData, MainData>().ForMember(d => d.Id, o => o.Ignore());
        // Mapper.CreateMap<Detail, Detail>().ForMember(d => d.Id, o => o.Ignore()); // REMOVED
        var newMainData = new MainData();
        Mapper.Map(this, newMainData);
        newMainData.Details = this.Details.Select(item => item.Clone()).ToList(); // ADDED
        return newMainData;
    }
}

public class Detail
{
    public int Id { get; private set; }
    public string Name { get; set; }
    public double Area { get; set; }
    public double Height { get; set; }

    public Detail Clone() // ADDED
    {
        Mapper.CreateMap<Detail, Detail>().ForMember(d => d.Id, o => o.Ignore());
        var newDetail = new Detail();
        Mapper.Map(this, newDetail);
        return newDetail;
    }
}

DasCloneie @ -Methode funktioniert gut für die MainData-Eigenschaften, scheint jedoch nur eine flache Kopie der Details-Liste zu erstellen. Ich habe versucht, @ hinzuzufüg.ForMember(d => d.Details, o => o.UseDestinationValue()) kopiert aber die Details-Liste überhaupt nicht. Wie kann ich die Details-Liste auch tief klonen, dh, ich erhalte zwei völlig unabhängige Objekte, einschließlich aller Listenelemente?

AKTUALISIEREN Ich muss die Id-Eigenschaft ausschließen, da ich diese Objekte mit NHibernate verwende. Daher bin ich mir nicht sicher, ob die Serializable-Lösung dies tut.

UPDATE2: Den obigen Code geändert, um auch die IList zu klonen. Dies scheint in Ordnung zu sein, da ich Eigenschaften ausschließen kann, die NHibernate glauben lassen, dass sie bereits gespeichert wurden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage