我想深克隆使用AutoMapper下面的類一個IList屬性深克隆對象:如何包含使用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性質,但似乎只能做一個淺拷貝的詳細信息列表。我曾嘗試添加.ForMember(d => d.Details, o => o.UseDestinationValue())
,但這並未完全複製「詳細信息」列表。我怎樣才能深入克隆詳細列表,也就是說,所以我最終得到兩個完全獨立的對象,包括所有列表項目?
UPDATE:我需要排除Id屬性,因爲我在NHibernate中使用這些對象,所以不確定Serializable解決方案是否會執行此操作。
UPDATE2:修改了上面的代碼來克隆IList。這似乎工作正常,因爲我可以排除使NHibernate認爲它已被保存的屬性。
非常好的庫,效果很好。不得不將PLINQ部分更改爲ForEach循環,因爲我還沒有使用.NET 4。 – 2010-08-04 00:41:25
@Piers邁爾斯,我做了一些更通用的克隆,你可以在這裏看到http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu 2011-02-08 08:14:17
感謝您的更新,我會檢查出來。 – 2011-02-08 09:03:51