2016-06-29 31 views
1

我有一个模型类:映射列表<Model>到词典<INT,视图模型>

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

我发现问题 - lambda参数可以是Model或Context。这里应该是上下文。我已经更新了你的代码,现在它工作正常。非常感谢! –

+0

@MichalDymel很高兴帮助:) – hazevich

相关问题