2014-01-07 5 views

Antwort

7

Wie üblich, gleich nachdem ich Post Frage Knopf drücken:

Mapper.Reset(); 
// from, to 
Mapper.CreateMap<InnerValue, DestinationClass>(); 
Mapper.CreateMap<SourceClass, DestinationClass>() 
    .ConvertUsing(s => Mapper.Map<InnerValue, DestinationClass>(s.Inner)); 

Mapper.AssertConfigurationIsValid(); 

var source = new SourceClass() { Inner = new InnerValue() { InnerPropertyId = 123, StringValue = "somethinges" } }; 

var dest = Mapper.Map<SourceClass, DestinationClass>(source); 
5

Mapping sollte sieht wie folgt aus:

CreateMap<SourceClass, DestinationClass>() 
    .ForMember(x => x.InnerPropertyId , x => x.MapFrom(z => z.Inner.InnerPropertyId)) 
    .ForMember(x => x.StrignValue , x => x.MapFrom(z => z.Inner.StrignValue)) 
; 
+1

Sieht gut aus :) Allerdings ist das manuelle Konfigurieren jeder Requisite genau das, was ich vermeiden wollte ... – b0rg

6

wir ein Problem mit dem ConvertUsing nicht über das voll bestückte Ergebnis geben, weil unsere Version von SourceClass hatte einen zusätzlichen Wert, den wir der DestinationClass zuordnen wollten

Wir fanden, dass der folgende Code das gewünschte Ergebnis ergab lt:

{ 
    ... 
    Mapper.CreateMap<InnerValue, DestinationClass>(MemberList.Source); 
    Mapper.CreateMap<SourceClass, DestinationClass>(MemberList.Source) 
      .ConstructUsing(s => Mapper.Map<DestinationClass>(s.Inner)) 
      .ForSourceMember(m => m.Inner, opt => opt.Ignore()); 
    ... 
} 

public class DestinationClass 
{ 
    public int InnerPropertyId { get; set; } 
    public string StringValue { get; set; } 
    public string SourceClassValue { get; set; } 
} 

public class SourceClass 
{ 
    public string SourceClassValue { get; set; } 
    public InnerValue Inner { get; set; } 
} 

public class InnerValue 
{ 
    public int InnerPropertyId { get; set; } 
    public string StrignValue {get;set;} 
} 

ConstructUsing weiterhin die übrigen Mitglieder zur Karte, nachdem er die inneren Elemente zugeordnet hat und ConvertUsing nicht.

+0

Das ist wirklich nett, aber ein Problem: Konfigurationsvalidierung schlägt fehl, da Zielmember aus 'Mapper.Map am inneren) 'werden immer noch als nicht zugeordnete – qtuan

+0

gemeldet Ich habe die Antwort aktualisiert, um Ihr Problem zu lösen. Die "MemberList.Source" ist der Schlüssel und reduziert die Anzahl der Ignorierungen, die notwendig sind. –

+0

In meinem Verständnis vernachlässige es Verweigerung der Zielmitglieder, die für meinen Fall nicht erlaubt ist. Was ich begehre, ist die Verifizierung, die einige Zielmitglieder verstehen kann, die bereits von 'ConstructUsing' gemappt wurden und weiterhin die restlichen Mitglieder verifizieren. Ich denke, das ist nicht möglich, da 'ConstructUsing' zur Laufzeit auflöst. Also meine Schlussfolgerung für jetzt ist, wie in Ihrer Antwort zu tun und einen Ergänzungstest hinzuzufügen. Vielen Dank! – qtuan

Verwandte Themen