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