2016-06-29 2 views
1

У меня есть класс модели:Отображение списка <Model> словарю <ИНТ, ViewModel>

public class Model { 
    public int Id {get;set;} 
    public string Name {get;set;} 
} 

и вид модели:

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

Я хочу отобразить список в словарь, где ключ будет Model.Id.

Я начал с такой конфигурацией:

configuration 
    .CreateMap<Model, KeyValuePair<int, ViewModel>>() 
    .ConstructUsing(
     x => 
      new KeyValuePair<int, ViewModel>(x.Id, _mapper.Map<ViewModel>(x))); 

Но я не хочу, чтобы использовать экземпляр сопоставителя в конфигурации. Есть ли другой способ достичь этого? Я видел некоторые ответы, где люди использовали x.MapTo(), но это, кажется, не будет доступно больше ...

ответ

0

Решение, предоставленное @hazevich, перестало работать после обновления 5.0. Это рабочее решение.


Вам нужно создать преобразователь типа:

public class ToDictionaryConverter : ITypeConverter<Model, KeyValuePair<int, ViewModel>> 
{ 
    public KeyValuePair<int, ViewModel> Convert(Model source, KeyValuePair<int, ViewModel> destination, ResolutionContext context) 
    { 
     return new KeyValuePair<int, ViewModel>(source.Id, context.Mapper.Map<ViewModel>(source)); 
    } 
} 

, а затем использовать его в конфигурации:

configuration 
    .CreateMap<Model, KeyValuePair<int, ViewModel>>() 
    .ConvertUsing<ToDictionaryConverter>(); 
1

Вы можете использовать экземпляр сопоставителя от параметра лямбды x.Engine.Mapper

Простого, как это

configuration 
    .CreateMap<Model, KeyValuePair<int, ViewModel>>() 
    .ConstructUsing(context => new KeyValuePair<int, ViewModel>(
     ((Model)context.SourceValue).Id, 
     context.Engine.Mapper.Map<ViewModel>(context.SourceValue))); 
+0

Спасибо - выглядит великолепно, но я думаю, что мне не хватает какой-то ссылки - Я получаю ошибки во время компиляции (хотя IntelliSense отлично работает): «ResolutionContext» не содержит определения для «Id» и «QuotationPosition» не содержит определения для «Engine» –

+1

Я нашел проблему - параметр лямбда может быть либо моделью, либо контекстом. Здесь должен быть контекст. Я обновил ваш код, и теперь он отлично работает. Большое спасибо! –

+0

@MichalDymel рад, что это помогло :) – hazevich

Смежные вопросы