AutoMapper:“忽略其余”?

有没有办法告诉AutoMapper忽略除了明确映射的属性之外的所有属性?

我有外部的DTO类,可能会从外部改变,我想避免指定每个属性明确忽略,因为添加新属性会在尝试将它们映射到我自己的对象时破坏功能(导致异常)。


这是我写的一个扩展方法,它会忽略目标上的所有不存在的属性。 不知道它是否仍然有用,因为问题已经超过两年了,但我遇到了同样的问题,不得不添加大量的手动忽略呼叫。

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>
(this IMappingExpression<TSource, TDestination> expression)
{
    var flags = BindingFlags.Public | BindingFlags.Instance;
    var sourceType = typeof (TSource);
    var destinationProperties = typeof (TDestination).GetProperties(flags);

    foreach (var property in destinationProperties)
    {
        if (sourceType.GetProperty(property.Name, flags) == null)
        {
            expression.ForMember(property.Name, opt => opt.Ignore());
        }
    }
    return expression;
}

用法:

Mapper.CreateMap<SourceType, DestinationType>()
                .IgnoreAllNonExisting();

更新 :显然这不能正常工作,如果你有自定义映射,因为它覆盖它们。 我想如果先调用IgnoreAllNonExisting然后再调用自定义映射,它仍然可以工作。

schdr有一个解决方案(作为这个问题的答案),它使用Mapper.GetAllTypeMaps()来找出哪些属性未映射并自动忽略它们。 看起来像是一个更强大的解决方案给我。


我已经更新了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();

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

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

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

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

链接地址: http://www.djcxy.com/p/74391.html

上一篇: AutoMapper: "Ignore the rest"?

下一篇: Scrollview only showing last dynamically added subview