为了账号安全,请及时绑定邮箱和手机立即绑定

AutoMapper:“忽略其余的”?

AutoMapper:“忽略其余的”?

慕哥9229398 2019-07-25 20:04:11
AutoMapper:“忽略其余的”?有没有办法告诉AutoMapper忽略除明确映射的属性之外的所有属性?我有外部DTO类可能会从外部更改,我想避免指定要显式忽略的每个属性,因为添加新属性会在尝试将它们映射到我自己的对象时破坏功能(导致异常)。
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我已经更新了Can Gencer的扩展,不会覆盖任何现有的地图。

public static IMappingExpression<TSource, TDestination> 
    IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression){
    var sourceType = typeof (TSource);
    var destinationType = typeof (TDestination);
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType) && x.DestinationType.Equals(destinationType));
    foreach (var property in existingMaps.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;}

用法:

Mapper.CreateMap<SourceType, DestinationType>()
                .ForMember(prop => x.Property, opt => opt.MapFrom(src => src.OtherProperty))
                .IgnoreAllNonExisting();


查看完整回答
反对 回复 2019-07-25
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

根据我的理解,问题是目标上的字段在源中没有映射字段,这就是为什么要寻找忽略那些非映射目标字段的方法。

您可以简单地使用,而不是实现和使用这些扩展方法

Mapper.CreateMap<destinationModel, sourceModel>(MemberList.Source);

现在,automapper知道它只需要验证所有源字段是否已映射,而不是相反。

您还可以使用:

Mapper.CreateMap<destinationModel, sourceModel>(MemberList.Destination);


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 1660 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信