如何使用AutoMapper .ForMember?


88

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

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

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

如果我在CreateMap <>中具有无效的类型名称,则可以看到“ ForMember”为有效方法,将鼠标悬停会显示该方法签名,正如我通常期望的那样。但是,一旦我给它两个有效的类型,ForMember便说它无法解析该符号,就好像该方法不可用一样。

我没有遇到的通用类受到某种约束吗?

谢谢


2
automapper.codeplex.com/…可能是您正在寻找的最佳文档。不要忘记CreateMap调用中的通用参数。
特拉维斯

2
应该注意的是,Mapper.CreateMap<Source, Dest>()下面所有答案中引用的静态方法现在(2016年)标记为过时
本·里普利

Answers:


130

尝试以下语法:

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

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

Mapper.CreateMap<Entity, EntityDto>();

请查看文档的相关部分以获取更多详细信息和其他映射方案。


1
我的问题是,在这种情况下尝试使用“ ForMember”时,我只会得到“无法解析符号'ForMember'”的信息,就像该方法不存在一样
Nellius 2011年

@Nellius,您尚未显示无法使用的代码。我已经展示了一个有效的例子。确保已定义了源通用类和目标通用类,并在项目中引用了AutoMapper,并且文档(以及我的回答)中显示的语法将起作用。
Darin Dimitrov

4
愚蠢的问题,选择意味着什么?
riadh gomri 2014年

@riadhgomri成员的一个或多个选项
andrewb 2015年

17

最后,我相信这与ReSharper有点不兼容。

ReSharper似乎导致Automapper代码显示不正确,但工作正常(即使显示红色并显示错误消息)。卸载ReSharper可以完全解决此问题。


2
什么版本的ReSharper?什么版本的AutoMapper?
科林·皮尔

1
我认为这个问题会影响Visual
Studio

对于re#8.2来说,对我来说也是一样,但与vs 2012一样,对于7.0来说效果很好。
卡洛斯·吉列尔莫·博拉尼奥斯·洛佩兹

为什么51票以上的答案不是所选答案?荒谬。
克里斯·霍克斯

4
因为它没有回答我问的问题。我的问题是,当使用正确的语法并正确引用所有内容时,Visual Studio中似乎无法识别这些方法。事实证明这是与转载有关的错误。另一个答案的确回答了一个与我所问的问题非常相似的问题,但这与我实际问到的完全不正确。
Nellius 2015年

9

一个示例实现如下:

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());

1

这种用法以及:

  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();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.