Ответ 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 );