使用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