Это метод расширения, который я написал, который игнорирует все несуществующие свойства в месте назначения. Не уверен, будет ли он по-прежнему полезен, так как этому вопросу более двух лет, но я столкнулся с той же проблемой, когда пришлось добавить множество игнорируемых вручную вызовов.
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()
, чтобы выяснить, какие свойства не сопоставлены, и автоматически игнорировать их. Мне кажется, это более надежное решение.