Wie tief Klon-Objekte, die eine IList-Eigenschaft mit AutoMapper

Ich versuche, tief-clone die folgende Klasse mit AutoMapper:

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

Den Clone Methode funktioniert gut für die MainData Eigenschaften scheint aber nur eine flache Kopie der Liste Details. Ich habe versucht, indem .ForMember(d => d.Details, o => o.UseDestinationValue()) aber dies bedeutet nicht, kopieren Sie die Details Liste auf alle. Wie bekomme ich die Liste Details Tiefe geklonte als auch ie, so dass ich am Ende mit zwei völlig eigenständige Objekte einschließlich aller Objekte in der Liste?

UPDATE: ich auszuschließen müssen Sie die Id-Eigenschaft, wie ich bin, mit Hilfe dieser Objekte mit NHibernate so nicht sicher, wenn Sie das Serializable-Lösung wird dies tun.

UPDATE2: Geändert, die obigen code-Klon der IList zu. Dies scheint gut zu funktionieren, wie ich ausschließen kann, dass Eigenschaften, die machen NHibernate denke, es ist schon gespeichert.

InformationsquelleAutor Piers Myers | 2010-08-03
Schreibe einen Kommentar