如何忽略所有目标成员,除了映射的成员?

epi*_*tka 64 c# automapper

有没有办法做到这一点?我们有一个SummaryDto,它映射了三种不同的类型,当我们为每种类型创建一个map时,未映射的props会抛出错误.摘要dto上有大约35个属性.要在每个上使用Ignore()选项太麻烦了.全球忽视了吗?就像是

CreateMap<Source,Target>()
   .IgnoreAllUnmapped();
Run Code Online (Sandbox Code Playgroud)

Cod*_*ing 117

这对我有用:

public static class MappingExpressionExtensions
{
    public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
    {
        expression.ForAllMembers(opt => opt.Ignore());
        return expression;
    }
}
Run Code Online (Sandbox Code Playgroud)

因为ForAllMembers返回void,ForAllMembers(o => o.Ignore())没有此扩展方法的调用将不起作用.我们希望保持映射表达式可用于启用后续映射:

CreateMap<Source, Destination>()
            .IgnoreAllUnmapped()
            .ForMember(d => d.Text, o => o.MapFrom(s => s.Name))
            .ForMember(d => d.Value, o => o.MapFrom(s => s.Id));
Run Code Online (Sandbox Code Playgroud)

  • 从5.0.0开始,这不起作用.您需要使用`ForAllOtherMembers(opt => opt.Ignore());`并且不要使用`ForAllMembers`来完成 (9认同)
  • @jsgoupil AutoMapper 11 已弃用 ForAllOtherMembers :( (3认同)
  • Automapper 11 中的唯一选项是显式列出所有字段,因此配置文件会因 100 多行无用代码而变得混乱。这是落后的。Automapper 的开发人员不想支持效率。 (3认同)
  • 这是删除和忽略常规映射。有没有办法保持传统的映射? (2认同)
  • @JoaoLeme我想你需要决定你想要完成什么.应该很少使用忽略所有成员.我不确定AutoMapper如何确定如何保持你所谓的"常规映射",但排除未映射.我认为最好在映射中明确指出您需要处理哪些成员 - 或者 - 使用IgnoreAllUnmapped扩展,然后指定您只希望映射显式定义的成员.也许你需要完成的一个例子可以说明你为什么要问这个特定的问题. (2认同)
  • @JoaoLeme你也可以查看这个答案 - [AutoMapper IgnoreTheRest](http://stackoverflow.com/questions/954480/automapper-ignore-the-rest/6474397#6474397) - 爱德华布雷在答案中指出对这个问题. (2认同)

Nic*_*een 30

我也在这个问题上挣扎了很长一段时间,或者至少是与此类似的问题.我有一个有很多属性的类(大约30个),我只想映射其中的4个.添加26个忽略语句似乎很疯狂(特别是当它意味着未来对类的更改将意味着必须更新它们时!)

我终于发现我可以告诉AutoMapper忽略所有内容,然后明确地添加我想要的那些.

// Create a map, store a reference to it in a local variable
var map = CreateMap<Source,Target>();

// Ignore all members
map.ForAllMembers(opt => opt.Ignore());

// Add mapping for P1
map.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));

// Add other mappings...
map.ForMember(dest => dest.P2, opt => opt.MapFrom( src => src.P2));
map.ForMember(dest => dest.P3, opt => opt.MapFrom( src => src.P3));
map.ForMember(dest => dest.P4, opt => opt.MapFrom( src => src.P4));
Run Code Online (Sandbox Code Playgroud)

你会认为你可以这样做(但不要因为它不会编译)你会被原谅:

// This won't compile
CreateMap<Source,Target>()
   .ForAllMembers(opt => opt.Ignore())
   .ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));
Run Code Online (Sandbox Code Playgroud)

这不起作用的原因是ForAllMembers()方法不支持流畅的链接样式(至少在当前版本2.0中).

好消息是非链接版本确实有效.当然需要注意的是,您需要明确告诉AutoMapper要映射哪些成员.我还没有找到一种简单的方法来同时使用它,这样你仍然可以使用隐含的映射并忽略破坏的映射.


Edw*_*rey 5

为避免必须显式指定映射属性,可以使用IgnoreAllNonExisting.它会忽略没有映射源属性的任何目标属性.