Копировать ссылку вместо новой глубокой копии

#c# #automapper

#c# #automapper

Вопрос:

У меня есть сопоставление для копирования человека и состояния, но когда я копирую состояние, мне не нужна глубокая копия человека, только ссылка, но я использую automapper для создания глубокой копии person где-то еще, поэтому есть сопоставление для person и для state.

     public class Person
    {
        public string Name { get; set; }
    }

    public class State
    {
        public string Name { get; set; }
        public Person CreatedBy { get; set; }
    }

    [TestMethod]
    public void CopyByReference()
    {
        Mapper.CreateMap<Person, Person>();
        Mapper.CreateMap<State, State>();

        var original = new State { Name = "Start", CreatedBy = new Person { Name = "Employee name" } };
        var copy = Mapper.Map<State>(original);
        Assert.AreEqual(original.Name, copy.Name);
        if (!ReferenceEquals(original.CreatedBy, copy.CreatedBy))
        {
            throw new Exception("I need a reference copy, not deep copy.");
        }
    }
  

Я пытался реализовать IValueResolver, но я тоже получил глубокую копию. Я мог бы просто игнорировать свойство CreatedBy и копировать ссылку после сопоставления, но это довольно некрасиво и выглядит очень подверженным ошибкам.

Ответ №1:

Automapper на самом деле не предназначен для этого, поэтому он всегда будет пытаться использовать сопоставление, если найдет его, поэтому он всегда пытается сопоставить ваши Person объекты…

Одним из обходных путей было бы Ignore CreatedBy скопировать на ваш State и скопировать его в обратном AfterMap вызове:

 Mapper.CreateMap<State, State>()
    .ForMember(d => d.CreatedBy, c => c.Ignore())
    .AfterMap((src, dest) => { dest.CreatedBy = src.CreatedBy; });
  

Ответ №2:

Вы могли бы удалить эту строку: Mapper.CreateMap<Person, Person>();

Это должно заставить AutoMapper копировать ссылку, а не выполнять глубокую копию.