Пропустить нулевые значения с помощью специального распознавателя
Я хочу использовать automapper для отображения между моими публичными контрактами на данные и моими моделями БД. Я создал класс, который автоматически проходит через все контракты и создает сопоставления. Единственная проблема, с которой я столкнулся, заключается в том, что я хочу отображать значения из контракта в модель БД только в том случае, если значение не равно нулю. Я посмотрел на другой вопрос здесь, но не могу увидеть примеры, которые используют собственные распознаватели.
Вот часть моего кода
var mapToTarget = AutoMapper.Mapper.CreateMap(contract, mappedTo);
foreach (var property in contract.GetProperties().Where(property => property.CustomAttributes.Any(a => a.AttributeType == typeof(MapsToProperty))))
{
var attribute = property.GetCustomAttributes(typeof(MapsToProperty), true).FirstOrDefault() as MapsToProperty;
if (attribute == null) continue;
mapToTarget.ForMember(attribute.MappedToName,
opt =>
opt.ResolveUsing()
.ConstructedBy(() => new ContractToSourceResolver(new MapsToProperty(property.Name, attribute.SourceToContractMethod, attribute.ContractToSourceMethod))));
}
private class ContractToSourceResolver : ValueResolver
{
private MapsToProperty Property { get; set; }
public ContractToSourceResolver(MapsToProperty property)
{
Property = property;
}
protected override object ResolveCore(IDataContract contract)
{
object result = null;
if (Property.ContractToSourceMethod != null)
{
var method = contract.GetType()
.GetMethod(Property.ContractToSourceMethod, BindingFlags.Public | BindingFlags.Static);
result = method != null ? method.Invoke(null, new object[] {contract}) : null;
}
else
{
var property =
contract.GetType().GetProperties().FirstOrDefault(p => p.Name == Property.MappedToName);
if (property != null)
{
result = property.GetValue(contract);
}
}
return result;
}
}
И вот как я хочу использовать это
AutoMapper.Mapper.Map(dataContract, dbModel)
В настоящее время это прекрасно работает, но если в dataContract есть значение NULL, оно заменит существующее значение в dbModel, это не то, что я хочу. Как заставить AutoMapper игнорировать нулевые исходные значения?
РЕДАКТИРОВАТЬ
Как указано в одном из ответов, это
Mapper.CreateMap().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
Это было бы идеально, за исключением того факта, что .ForAllMembers не доступен из
Mapper.CreateMap(SourceType, DestinationType)