Automapper目前不支持基于类型的属性忽略。
目前有三种方法可以忽略属性:
Mapper.CreateMap<Source, Dest>()
.ForMember(d => d.IgnoreMe, opt => opt.Ignore());
这就是您想要避免的。
使用IgnoreMapAttribute
对您的IEnumerable<SelectListItem>
属性进行注释。
如果您的IEnumerable<SelectListItem>
属性名称遵循某些命名约定,例如它们都以单词"Select"
开头,您可以使用AddGlobalIgnore
方法在全局范围内忽略它们:
Mapper.Initialize(c => c.AddGlobalIgnore("Select"))
但是使用此方法只能匹配以某字符开头的内容。
然而,您可以为第一种选项创建一个方便的扩展方法,当调用CreateMap
时,它会自动忽略给定类型的属性:
public static class MappingExpressionExtensions
{
public static IMappingExpression<TSource, TDest>
IgnorePropertiesOfType<TSource, TDest>(
this IMappingExpression<TSource, TDest> mappingExpression,
Type typeToIgnore
)
{
var destInfo = new TypeInfo(typeof(TDest));
foreach (var destProperty in destInfo.GetPublicWriteAccessors()
.OfType<PropertyInfo>()
.Where(p => p.PropertyType == typeToIgnore))
{
mappingExpression = mappingExpression
.ForMember(destProperty.Name, opt => opt.Ignore());
}
return mappingExpression;
}
}
您可以按以下方式使用:
Mapper.CreateMap<Source, Dest>()
.IgnorePropertiesOfType(typeof(IEnumerable<SelectListItem>));
所以它仍然不是一个全局解决方案,但您不必列出需要忽略哪些属性,它适用于同一类型的多个属性。
如果您不怕弄脏手:
目前有一种非常hacky的解决方案,它深入了 Automapper 的内部。我不知道这个API有多公开,因此该解决方案可能会在未来失效:
您可以订阅 ConfigurationStore
的 TypeMapCreated
事件。
((ConfigurationStore)Mapper.Configuration).TypeMapCreated += OnTypeMapCreated;
并在创建的TypeMap
实例上直接添加基于类型的忽略:
private void OnTypeMapCreated(object sender, TypeMapCreatedEventArgs e)
{
foreach (var propertyInfo in e.TypeMap.DestinationType.GetProperties())
{
if (propertyInfo.PropertyType == typeof (IEnumerable<SelectListItem>))
{
e.TypeMap.FindOrCreatePropertyMapFor(
new PropertyAccessor(propertyInfo)).Ignore();
}
}
}
Mapper.GetAllTypeMaps
可能是不错的选择。然而,如果你在不同的时间和地点添加映射,那么使用TypeMapCreated
事件会更好。 - nemesv