Сопоставление словарей с помощью AutoMapper

Учитывая эти классы, как я могу отобразить их словарь?

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

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


Mapper.CreateMap<TestClass, TestClassDto>();
Mapper.CreateMap<Dictionary<string, TestClass>, 
                  Dictionary<string, TestClassDto>>();

var testDict = new Dictionary<string, TestClass>();
var testValue = new TestClass() {Name = "value1"};
testDict.Add("key1", testValue);

var mappedValue = Mapper.Map<TestClass, TestClassDto>(testValue);

var mappedDict = Mapper.Map<Dictionary<string, TestClass>, 
                            Dictionary<string, TestClassDto>>(testDict);

Сопоставление одного из них, mappedValue в этом случае отлично работает.

Отображение словаря из них заканчивается без записей в целевом объекте.

Что я делаю worng?

Ответ 1

Проблема, с которой вы сталкиваетесь, заключается в том, что AutoMapper пытается сопоставить содержание словаря. Вы должны подумать, что это за хранилище - в этом случае KeyValuePairs.

Если вы попытаетесь создать сопоставитель для комбинации KeyValuePair, вы быстро поймете, что не можете напрямую, поскольку свойство Key не имеет сеттера.

AutoMapper обходит это, позволяя вам использовать Карту с помощью конструктора.

/* Create the map for the base object - be explicit for good readability */
Mapper.CreateMap<TestClass, TestClassDto>()
      .ForMember( x => x.Name, o => o.MapFrom( y => y.Name ) );

/* Create the map using construct using rather than ForMember */
Mapper.CreateMap<KeyValuePair<string, TestClass>, KeyValuePair<string, TestClassDto>>()
      .ConstructUsing( x => new KeyValuePair<string, TestClassDto>( x.Key, 
                                                                    x.Value.MapTo<TestClassDto>() ) );

var testDict = new Dictionary<string, TestClass>();
var testValue = new TestClass()
{
    Name = "value1"
};
testDict.Add( "key1", testValue );

/* Mapped Dict will have your new KeyValuePair in there */
var mappedDict = Mapper.Map<Dictionary<string, TestClass>,
Dictionary<string, TestClassDto>>( testDict );