c# - 如何使用 AutoMapper 深度克隆包含 IList 属性的对象

标签 c# list clone automapper valueinjecter

我正在尝试使用 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 认为它已被保存的属性。

最佳答案

这是一个使用 ValueInjecter 的解决方案

        var clone = new MainData();

        clone.InjectFrom(mainData);//mainData is your source

        mainData.Details.AsParallel.ForAll(detail => 
        {
            var dc = new Detail();
            dc.InjectFrom(detail);
            clone.AddDetail(dc);
        });

不会设置具有私有(private) setter 的属性,(看起来合理)
祝你好运;)

编辑: 我做了一个更好的解决方案看看here

关于c# - 如何使用 AutoMapper 深度克隆包含 IList 属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3396808/

相关文章:

java - 如何在Java中使用对象的ID和LocalDateTime字段正确过滤列表?

java - 修改克隆对象

android - 如何克隆 View ?

C# nameof 变成强类型参数?

c# - 在 WCF 消息检查中,如何在消息对象中查找输入参数的值?

php如何生成动态list()?

python - 在 Python 中从 JSON 数据创建列表和字典

drupal 6 cck字段: is there a easy way to duplicate cck field?

c# - 静态属性和构造函数注入(inject)潜在的内存泄漏

c# - 建立 SIP 连接后如何流式传输音频