Tôi cố gắng để nhân bản sâu lớp sau đây sử dụng AutoMapper:Làm thế nào để đối tượng nhân bản sâu chứa một tài sản IList sử dụng 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;
}
}
Phương pháp Clone
hoạt động tốt cho các thuộc tính MainData nhưng dường như chỉ làm một bản sao cạn của danh sách Chi tiết. Tôi đã thử thêm .ForMember(d => d.Details, o => o.UseDestinationValue())
nhưng điều này không sao chép danh sách chi tiết cả. Làm thế nào tôi có thể nhận được danh sách chi tiết nhân bản sâu cũng như tức là, vì vậy tôi kết thúc với hai đối tượng hoàn toàn độc lập bao gồm tất cả các mục danh sách?
CẬP NHẬT: Tôi cần loại trừ thuộc tính Id vì tôi đang sử dụng các đối tượng này với NHibernate để không chắc chắn nếu giải pháp Serializable có thể thực hiện việc này.
CẬP NHẬT 2: Đã sửa đổi mã ở trên để sao chép IList quá. Điều này dường như làm việc tốt như tôi có thể loại trừ các thuộc tính mà làm cho NHibernate nghĩ rằng nó đã được lưu.
Thư viện rất hay, hoạt động tốt. Đã phải thay đổi phần PLINQ thành vòng lặp ForEach vì tôi chưa sử dụng .NET 4. –
@Pier Myers, tôi đã làm một cái gì đó chung chung hơn cho nhân bản, bạn có thể nhìn thấy nó ở đây http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu
cảm ơn cho bản cập nhật, tôi sẽ kiểm tra xem nó ra. –