Копировать элементы списка с помощью AutoMapper - PullRequest
3 голосов
/ 27 декабря 2010

Когда я сопоставляю объект со свойством List, Automapper по умолчанию устанавливает свойство list объекта-получателя для экземпляра из исходного объекта.

Существует ли способ для автопроизводителя создать новый список и скопироватьэлементы, но не копировать экземпляр списка?

Я бы хотел пройти следующий тест:

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.

Ответы [ 2 ]

3 голосов
/ 04 января 2011

То, что вы просите, это глубокое клонирование, что-то AutoMapper на самом деле не предназначен для .

Есть и другие доступные варианты. Посмотрите, будет ли ValueInjecter работать для вас.

Посмотрите на Глубокое клонирование с помощью ValueInjecter

0 голосов
/ 21 августа 2015

Я решаю эту проблему, определяя метод расширения следующим образом:

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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...