如何在AutoMapper中全局使用Ignore?

问题描述 投票:0回答:6

这是现在的样子。 DestinationA 和 DestinationB 派生自某个 DestinationBase 类。我需要忽略所有这些派生类的一些常见属性。无论如何,是否可以全局应用这些忽略选项,而不必对所有派生的目标类重复? Mapper.CreateMap<SourceA, DestinationA>() .ForMember(d => d.PropA, opt => opt.Ignore()) .ForMember(d => d.PropB, opt => opt.Ignore()) .ForMember(d => d.PropC, opt => opt.Ignore()); Mapper.CreateMap<SourceB, DestinationB>() .ForMember(d => d.PropA, opt => opt.Ignore()) .ForMember(d => d.PropB, opt => opt.Ignore()) .ForMember(d => d.PropC, opt => opt.Ignore());

我期待这样的事情:

Mapper.CreateMap<DestinationBase>().ForAllSource() .ForMember(d => d.PropA, opt => opt.Ignore()) .ForMember(d => d.PropB, opt => opt.Ignore()) .ForMember(d => d.PropC, opt => opt.Ignore());

	
c# mapping automapper
6个回答
3
投票

var mapperConfiguration = new MapperConfiguration(cfg => { cfg.AddProfile(new MyProfile()); // ignore all unmapped properties globally cfg.ForAllMaps((map, exp) => exp.ForAllOtherMembers(opt => opt.Ignore())); });



2
投票

public static IMappingExpression<TSource, TDestination> IgnoreAllNonMapped<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) { foreach (var property in Mapper.FindTypeMapFor<TSource, TDestination>().GetUnmappedPropertyNames()) { expression.ForMember(property, opt => opt.Ignore()); } return expression; }



2
投票

我有几个从基类派生的类。 我想从派生自基类的任何类的所有映射中排除该基类的属性。 创建映射后(并且不指定任何忽略选项),我这样做:

foreach(var map in Mapper.GetAllTypeMaps()) { if (typeof(MyBaseClass).IsAssignableFrom(map.DestinationType)) { var propInfo = map.DestinationType.GetProperty("PropertyToIgnore"); if (propInfo != null) { map.FindOrCreatePropertyMapFor(new AutoMapper.Impl.PropertyAccessor(propInfo)).Ignore(); } } }

这有点暴力,因为我必须循环遍历所有类型映射,但它可以完成工作。

编辑:在 if 语句中添加了缺失的 {


0
投票

AutoMapper:“忽略其余部分”?
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>() .IgnoreAllNonExisting();



0
投票
文档

[Ignore] public string Property { get; set; }

这种方法的问题是您跨域实体泄漏了 AutoMapper 实现,这不太好。

更好的方法似乎是通过定义您自己的

MapperConfiguration

委托,或在默认实现上附加一个条件,在全局范围内设置

ShouldMapProperty
过滤。
文档
var configuration = new MapperConfiguration(cfg => { cfg.ShouldMapField = ...; cfg.ShouldMapProperty = ...; });

撰写本文时的默认实现是
这里

。值得注意的是,如果未指定为 ShouldMapProperty,则

p => p.IsPublic()
会回落。所以你可以做
p => p.IsPublic() && p.DeclaringType != typeof(SomeBaseType) && p.Name == nameof(SomeBaseType.SomePropertyToIgnore)
    


0
投票
AddGlobalIgnore

。这在 AutoMapper 13.0 或更高版本中可用。

例如:AddGlobalIgnore("CreatorUserId");

© www.soinside.com 2019 - 2024. All rights reserved.