【问题标题】:How to use AutoMapper .ForMember?如何使用 AutoMapper .ForMember?
【发布时间】:2011-10-22 12:51:48
【问题描述】:

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

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

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

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

对我没有遇到的泛型类有某种限制吗?

谢谢

【问题讨论】:

  • automapper.codeplex.com/… 可能是您想要做的最好的文档。不要忘记 CreateMap 调用中的通用参数。
  • 需要注意的是,下面所有答案中引用的静态Mapper.CreateMap&lt;Source, Dest&gt;()方法现在都是(2016)marked obsolete

标签: .net automapper


【解决方案1】:
 CreateMap<ClassRoom, ClassRoomDto>()
            .ForMember(opt => opt.StudentNumber, conf => conf.MapFrom(x => x.Student == null ? (long?)null : x.Student.StudentNumber))
            .ForMember(opt => opt.StudentFullName, conf => conf.MapFrom(x => x.Student == null ? null : x.Student.Name + " " + x.Student.Surname))
            .ReverseMap()
            .ForMember(opt => opt.Student, conf => conf.Ignore());

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

这个用法还有:

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

【讨论】:

    【解决方案3】:

    试试下面的语法:

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

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

    Mapper.CreateMap<Entity, EntityDto>();
    

    请查看documentation的相关部分了解更多详情和其他映射场景。

    【讨论】:

    • 我的问题是,当尝试在该上下文中使用“ForMember”时,我只是得到“无法解析符号'ForMember'”,就好像该方法不存在一样
    • @Nellius,你没有显示你的 non-working 代码。我已经展示了一个工作示例。确保定义了源泛型类和目标泛型类,并在项目中引用了 AutoMapper,并且文档(以及我的答案)中显示的语法将起作用。
    • 愚蠢的问题,opt是什么意思?
    • @riadhgomri 选项/会员选项
    【解决方案4】:

    最后,我相信这是与 ReSharper 的某种不兼容。

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

    【讨论】:

    • 什么版本的 ReSharper?什么版本的 AutoMapper?
    • 我认为这个问题会影响 VisualStudio 2010 中的 AutoMapper 和 ReSharper 8.x。请参阅 github.com/AutoMapper/AutoMapper/issues/381
    • re# 8.2 对我来说也是如此,但与 2012 相比,7.0 工作正常。
    • 为什么 51 票赞成的答案不是选定的答案?荒谬。
    • 因为它没有回答我提出的问题。我的问题是,当使用正确的语法并正确引用所有内容时,Visual Studio 似乎无法识别这些方法。这原来是一个与 resharper 相关的错误。另一个答案确实回答了与我提出的问题非常相似的问题,但与我实际提出的问题相比,它是一个完全错误的答案。
    【解决方案5】:

    一个示例实现如下:

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

    【讨论】:

      【解决方案6】:

      你是这样的吗

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

      This page 有一些很好的例子

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多