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;
}
}
DasClone
ie @ -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.