使用AutoMapper复制列表项目

当我使用List属性映射对象时,Automapper默认将目标对象的列表属性设置为源对象中的实例。

有没有一种方法让automapper创建一个新列表并复制项目但不复制列表实例?

我想通过以下测试:

var widget = new Widget
                {
                    Tags = new List<string> {"big", "bright"}
                };

Mapper.Reset();
Mapper.CreateMap<Widget, Widget>();

var widgetCopy = Mapper.Map<Widget, Widget>(widget);

CollectionAssert.Contains(widgetCopy.Tags, "big");
CollectionAssert.Contains(widgetCopy.Tags, "bright");
Assert.AreNotSame(widget.Tags, widgetCopy.Tags);

小部件类看起来像这样:

class Widget
{
    public IList<string> Tags { get; set; }
}

当前最后一个断言失败,因为两个标签属性指向列表的同一个实例。 当对象被NHibernate持久化时,这是一个问题。


你所要求的是深度克隆,AutoMapper并不是真正设计的。

还有其他选项可用。 看看ValueInjecter是否会为你工作。

使用ValueInjecter查看深度克隆


我通过定义一个像这样的扩展方法来解决这个问题:

public static class DeepCopyExtensions
{
    public static List<T> DeepCopy<T>(this List<T> original)
    {
        lock(original) 
            return original.Select(AutoMapper.Mapper.Map<T, T>).ToList();
    }

    public static T DeepCopy<T>(this T original)
    {
        return AutoMapper.Mapper.Map<T, T>(original);
    }
}

并像这样定义我的AutoMapper映射:

Mapper.CreateMap<Widget, Widget>()
    .ForMember(
        dest => dest.Tags,
        opt => opt.MapFrom(src => src.Tags.DeepCopy()));
链接地址: http://www.djcxy.com/p/37367.html

上一篇: Copy list items with AutoMapper

下一篇: Mapping from list down to object with AutoMapper