добавление элементов в новую коллекцию вместо замены всей коллекции - PullRequest
1 голос
/ 28 ноября 2011

Я использую Automapper, и мне интересно, можно ли добавить все элементы в коллекции из источника к месту назначения.

Обратите внимание на следующее:

public class A { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); }

public class B { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); }

Затем вы создаете сопоставления:

Mapper.CreateMap<A, B>();

И сделать собственно отображение:

Mapper.Map<A, B>(instanceOfA);

Я верю, что за экранами это произойдет:

newInstanceOfB.myDictionary = instanceOfA.myDictionary

Но можно ли сказать Automapper сделать это (может быть, с помощью специального конвертера чего-то ...):

foreach (var item in instanceOfA.myDictionary)
    newInstanceOfB.myDictionary[item.Key] = item.Value

1 Ответ

7 голосов
/ 29 ноября 2011

Мне кажется, это работает

Mapper.CreateMap<A, B>()
     .ForMember(d => d.myDictionary, opt => opt.ResolveUsing(
                s => s.myDictionary.ToDictionary(pair => pair.Key, pair => pair.Value)));

Вот полный образец

public class A { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); }
public class B { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); }

class Program
{
    static void Main(string[] args)
    {
        var instanceOfA = new A
                              {
                                  myDictionary = new Dictionary<int, string>
                                                     {
                                                         {1, "a"},
                                                         {2, "b"}
                                                     }
                              };
        Mapper.CreateMap<A, B>()
            .ForMember(d => d.myDictionary, opt => opt.ResolveUsing(
              s => s.myDictionary.ToDictionary(pair => pair.Key, pair => pair.Value)));
        var instanceOfB = Mapper.Map<A, B>(instanceOfA);
        instanceOfA.myDictionary[1] = "c";

        if (instanceOfB.myDictionary[1] == "c")
            Console.WriteLine("Failed");
        else
            Console.WriteLine("Succeeded");
        Console.ReadLine();
    }
}

Редактировать после комментариев: * Отредактировано снова *

Mapper.CreateMap<A, B>()
   .ForMember(d => d.myDictionary, opt => opt.Ignore())
   .AfterMap((s, d) =>
                      {
                       d.myDictionary.Clear();
                       s.myDictionary.ToList().ForEach(p => d.myDictionary.Add(p));
                   });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...