我正在尝试使用 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;
}
}
该Clone
方法适用于 MainData 属性,但似乎只对 Details 列表进行了浅拷贝。我尝试添加.ForMember(d => d.Details, o => o.UseDestinationValue())
,但这根本不会复制详细信息列表。如何将详细信息列表也进行深度克隆,即最终得到两个完全独立的对象,包括所有列表项?
更新:我需要排除 Id 属性,因为我将这些对象与 NHibernate 一起使用,所以不确定 Serializable 解决方案是否会这样做。
UPDATE2:修改了上面的代码来克隆IList。这似乎工作正常,因为我可以排除使 NHibernate 认为它已经被保存的属性。