这是现在的样子。 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());
var mapperConfiguration = new MapperConfiguration(cfg =>
{
cfg.AddProfile(new MyProfile());
// ignore all unmapped properties globally
cfg.ForAllMaps((map, exp) => exp.ForAllOtherMembers(opt => opt.Ignore()));
});
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;
}
我有几个从基类派生的类。 我想从派生自基类的任何类的所有映射中排除该基类的属性。 创建映射后(并且不指定任何忽略选项),我这样做:
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 语句中添加了缺失的 {
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();
。
[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)
。AddGlobalIgnore
。这在 AutoMapper 13.0 或更高版本中可用。
例如:AddGlobalIgnore("CreatorUserId");