Überspringen Sie Nullwerte mit benutzerdefinierter Konfliktlöser

Will ich mit automapper die Zuordnung zwischen meine öffentlichen Daten Verträge und meine DB-Modelle. Ich habe eine Klasse angelegt, die automatisch geht durch alle Verträge sind erstellt Zuordnungen. Das einzige problem das ich habe ist, dass ich nur wollen, um die anzeigen-Werte aus den Vertrag mit dem DB-Modell, wenn der Wert nicht null ist. Ich habe mir andere Frage auf, die hier aber nicht sehen-Beispiele für benutzerdefinierte Konfliktlöser.

Hier ist mein code

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<ContractToSourceResolver>()
                            .ConstructedBy(() => new ContractToSourceResolver(new MapsToProperty(property.Name, attribute.SourceToContractMethod, attribute.ContractToSourceMethod))));
}


private class ContractToSourceResolver : ValueResolver<IDataContract, object>
{
  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;
   }
}

Und dies ist, wie ich es verwenden möchten

AutoMapper.Mapper.Map(dataContract, dbModel)

Diese derzeit funktioniert Super, aber wenn es einen NULL-Wert in den dataContract-dann wird es ersetzt den vorhandenen Wert in der dbModel, das ist nicht das, was ich will. Wie mache ich AutoMapper ignorieren null-Werte Quelle?

BEARBEITEN

Wie bereits in einer der Antworten gibt es in diesem

Mapper.CreateMap<SourceType, DestinationType>().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));

Diese wäre ideal, außer der Tatsache, dass .ForAllMembers ist nicht zugänglich

Mapper.CreateMap(SourceType, DestinationType)

InformationsquelleAutor Mike Norgate | 2013-11-16

Schreibe einen Kommentar