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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
hier ist eine Lösung, mit der ValueInjecter
Eigenschaften haben private setter sind nicht gesetzt wird, (sieht vernünftig)
viel Glück 😉
BEARBEITEN:
Ich habe eine bessere Lösung Aussehen hier
AutoMapper nicht wirklich ein Klonen-API. Ich würde stattdessen verwenden Sie das Klonen-trick:
Funktioniert es nicht für jede situation, aber es ist ziemlich praktisch.