如何使用AutoMapper .ForMember?

时间:2011-08-08 16:06:00

标签: .net automapper

我正在尝试设置AutoMapper以将实体转换为DTO。我知道我应该在.ForMember()之后使用Mapper.CreateMap<Entity, DTO>()来设置自定义映射,但这似乎不是一种可用的方法。

编辑以澄清: 我不是要查找我已阅读的文档的链接,或者是基本语法的解释。我正在使用答案和文档中描述的正确语法,例如:

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

如果我在CreateMap中有一个无效的类型名称&lt;&gt;我可以看到“ForMember”作为一种有效的方法,鼠标悬停显示方法签名,正如我通常所期望的那样。但只要我给它两个有效类型,ForMember说它无法解析符号,就好像方法不可用一样。

对于我没有遇到的泛型类,是否存在某种约束?

由于

5 个答案:

答案 0 :(得分:110)

请尝试以下语法:

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

或者如果源和目标属性具有相同的名称:

Mapper.CreateMap<Entity, EntityDto>();

请查看documentation的相关部分,了解更多详情和其他地图方案。

答案 1 :(得分:15)

最后,我认为这与ReSharper有些不相容。

ReSharper似乎导致Automapper代码显示不正确,但工作正常(即使它显示带有错误消息的红色)。卸载ReSharper完全解决了这个问题。

答案 2 :(得分:7)

示例实现如下:

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

我们需要映射这个属性,因为Game和GameViewModel的属性名称是不同的 - 如果它们相同且类型相同则不需要ForMember

ForMember的另一个用途是忽略映射

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());

答案 3 :(得分:0)

此用法以及

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();

答案 4 :(得分:-7)

你这样做吗

Mapper.CreateMap<SourceType,DestinationType>().ForMember(What ever mapping in here)

This page有一些很好的例子