Сопоставление словарей с AutoMapper - PullRequest
13 голосов
/ 13 мая 2011

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

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, работает нормально.

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

Что я делаю?

1 Ответ

16 голосов
/ 18 июня 2011

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