Automapper: Aktualisieren Sie Eigenschaftswerte, ohne ein neues Objekt zu erstellen


260

Wie kann ich mit automapper die Eigenschaftswerte eines anderen Objekts aktualisieren, ohne ein neues zu erstellen?

Antworten:


455

Verwenden Sie die Überlastung, die das vorhandene Ziel übernimmt:

Mapper.Map<Source, Destination>(source, destination);

Ja, es gibt das Zielobjekt zurück, aber das gilt nur für einige andere obskure Szenarien. Es ist das gleiche Objekt.


28
Danke, Jimmy ... Ich habe mich absichtlich von AutoMapper ferngehalten, weil ich Angst hatte, dass sich die Lernkurve auf meinen Zeitplan auswirkt. Es tut mir offiziell leid, dass ich so lange weggeblieben bin ... es ist viel einfacher als ich ursprünglich dachte.
Neil T.

13
Automapper muss eine der nützlichsten Bibliotheken sein. Auch ich habe es lange vermieden, viel zu lange. Ich habe heute angefangen, es zu benutzen und bin sehr überrascht, wie einfach es zu benutzen ist.
Mcottingham

4
Arbeite nicht für mich. Ich versuche, dem gleichen Typ zuzuordnen, aber es wird ein neues Objekt zurückgegeben. Benutzer u1, u3 = neuer Benutzer (); u1 = neuer Benutzer {Id = 1, NickName = "vami"}; Benutzer u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter

7
Zu Ihrer Information, ich habe festgestellt, dass Sie die Typparameter nicht angeben müssen. Mapper.Map (Quelle, Ziel) funktioniert einfach. Schön und einfach!
Judah Gabriel Himango

2
Hat sich das NULL-Verhalten in Release 4.2.1 geändert? Ich sehe, dass die Zuordnung von null zu einem Objekt null zurückgibt. Während in 2.2.1 die Zuordnung von null zu einem vorhandenen Objekt das vorhandene Objekt zurückgab.
Peter McEvoy

18

Damit dies funktioniert, müssen Sie CreateMap für Quell- und Zieltypen erstellen, auch wenn diese vom selben Typ sind. Das heißt, wenn Sie möchten, müssen Mapper.Map<User, User>(user1, user2); Sie eine Karte wie diese erstellen Mapper.Create<User, User>()


1
Ha! Ich habe gerade das Gleiche gefunden und der akzeptierten Antwort einen Kommentar hinzugefügt. IMHO ist die akzeptierte Antwort ohne Ihre Erklärung nicht vollständig, aber nach meinem Kommentar könnte es endlich sein :)
Andrzej Martyna

Dies ist eine großartige Ergänzung. In der ursprünglichen Frage wurden jedoch die Typen der Quelle und des Ziels nicht erwähnt, und es wurde nicht verlangt, dass sie vom gleichen Typ sind.
Jpaugh

4

Wenn Sie anstelle der in der akzeptierten Antwort verwendeten statischen Methode eine Instanzmethode von IMapper verwenden möchten, können Sie Folgendes tun (getestet in AutoMapper 6.2.2)

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

destwird nun mit allen Eigenschaftswerten aktualisiert, die von srcihm gemeinsam genutzt wurden. Die Werte seiner einzigartigen Eigenschaften bleiben gleich.

Hier ist der relevante Quellcode

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.