【问题标题】:Copy list items with AutoMapper使用 AutoMapper 复制列表项
【发布时间】:2010-12-27 10:44:39
【问题描述】:

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


    【解决方案1】:

    你要求的是深度克隆,AutoMapper isn't really designed to do

    还有其他可用选项。看看ValueInjecter 是否适合你。

    Deep cloning with ValueInjecter

    【讨论】:

      【解决方案2】:

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

      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()));
      

      【讨论】:

        猜你喜欢
        • 2012-02-12
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 2011-08-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多