2012-04-02 3 views
5

Ich verwende Automapper, um zwei Objekte des gleichen Typs aufzunehmen und alle neuen Werte abzubilden, die sich geändert haben. Ich habe versucht, den Code unten zu verwenden, aber es wirft immer einen Fehler auf und ich bin nicht einmal sicher, ob dies sogar mit Automapper erreicht werden kann.AutoMapper - Map mit den gleichen Quell- und Zielobjekttypen

Zum Beispiel:

 Mapper.CreateMap<UserDetails, UserDetails>(); 
     UserDetails userDetails = Mapper.Map<UserDetails, UserDetails>(userDetailsCurrent, userDetailsNew); 

Grundsätzlich muss ich über alle neuen Werte kopieren, die in der neuen Objekt „userDetailsNew“ an das bestehende Objekt „userDetailsCurrent“ kommen - auch wenn sie vom gleichen Typ . Auf diese Weise kann ich das vorhandene Objekt mit den neuen Werten "updaten". Der Grund, warum ich das tue, ist, weil ich nicht sicher bin, welche Benutzerdetails weitergegeben werden - ich muss sie abbilden, wenn sie ankommen.

Ich habe normalerweise Automapper verwendet, um verschiedene Objekte mit ähnlichen Eigenschaften zu mappen - aber ich dachte, dass ich die Kraft von Automapper verwenden könnte, um dasselbe auf diese Weise zu erreichen. Es könnte sogar eine bessere Lösung geben - jede Hilfe wäre willkommen!

+0

Sollte 'Mapper.Map' eine' UserDetails' oder eine 'UserSession' zurückgeben? –

+0

Es sollte UserDetails zurückgeben - ich habe gerade das Codebeispiel aktualisiert. – Deano

+0

Welcher Fehler wird ausgelöst? –

Antwort

6

Dies scheint für mich zu arbeiten. Mein benutzerdefinierter Typ:

class MyType 
{ 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

Mein Mapping-Code:

Mapper.CreateMap<MyType, MyType>(); 
var source = new MyType() {MyInt = 1, MyString = "Hello world"}; 
var dest = Mapper.Map<MyType, MyType>(source); 

Was ist mit Ihrem benutzerdefinierten Typ über einfache Eigenschaften interessant?

+0

Das sieht gut aus - Ich bin nicht in der Nähe von meinem PC, also werde ich das überprüfen und so schnell wie möglich zurück! – Deano

+0

Gibt es eine Möglichkeit, dass ich es ohne ForMember() tun kann? Es könnte sauberer sein, dies nicht für jede Eigenschaft des Objekts zu tun. – Deano

+0

Ja, es funktioniert immer noch, wenn Sie nicht ForMember tun. Ich bin nur so daran gewöhnt, diejenigen zu benutzen, die ich ursprünglich aufgenommen habe. –

4

Dies kann mit Tupeln und durch Erstellen eines benutzerdefinierten Typkonverters, der von der abstrakten TypeConverter-Klasse von Automapper stammt, erfolgen.

Sagen Sie bitte eine Quell- und Zielklasse hatte:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Firstname: {0}, Lastname: {1}", FirstName, LastName); 
    } 
} 

Dann Sie die benutzerdefinierte umrichtertyp als

public class CustomerPersonConverter : TypeConverter<Tuple<Person, Person>, Person> 
{ 
    protected override Person ConvertCore(Tuple<Person, Person> source) 
    { 
     var orginalValues = source.Item1; 
     var updatedValues = source.Item2; 

     var result = new Person 
      { 
       FirstName = string.IsNullOrEmpty(updatedValues.FirstName) ? orginalValues.FirstName : updatedValues.FirstName, 
       LastName = string.IsNullOrEmpty(updatedValues.LastName) ? orginalValues.LastName : updatedValues.LastName 
      }; 

     return result; 
    } 
} 

die wie bauen konnte

var orginal = new Person() {FirstName = "Clifford", LastName = "Mayson"}; 
     var updated = new Person() {FirstName = "Cliff"}; 

     Mapper.CreateMap<Tuple<Person, Person>, Person>().ConvertUsing<CustomerPersonConverter>(); 

     var result = Mapper.Map<Person>(new Tuple<Person, Person>(orginal, updated)); 

     Console.WriteLine(result); 

verwendet werden könnten, die würde das Ergebnis produzieren, dass der ursprüngliche Nachname-Wert beibehalten wird, der im Update fehlte, aber update den Wert des Vornamens eingeben, z.

Firstname: Cliff, Lastname: Mayson 
+0

Danke für das klare Beispiel. – PratikSatikunvar

Verwandte Themen