2016-08-05 26 views
0

Das ist mein Dto Modell ObjektWie ordnen Sie List-Werte mit Automapper String zu?

public class SourceClass 
{ 
    public List<SourceList> SourceLists { get; set; } 
} 

public class SourceList 
{ 
    public bool Type1 { get; set; } 
    public bool Type2 { get; set; } 
    public bool Type3 { get; set; } 
    public decimal Value { get; set; } 
} 

Ich Abbildung meiner Viewmodel

public class DestinationClass 
{ 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
    public string Value3 { get; set; } 

} 

Mit meiner eigenen Resolver-Methode. Das Ziel besteht darin, die Werte der Liste zu ViewModel-Werten zuzuordnen, wenn die Dto-Liste das entsprechende bool als wahr hat. Beispiel: Wenn die Liste IsValue1 als wahr enthält, muss der viewModel Value1 mit dem Value aktualisiert werden, der von IsValue1 kommt.

Es aktualisiert derzeit Werte aller Eigenschaften in dem ViewModel mit demselben Wert, d. H. Wert1, Wert2 und Wert3 haben denselben Wert von Wert1. Es sucht nach der Bedingung IsValue1, die im Dto wahr ist, es sei denn, ich entferne den Wert.

public class Resolver : ValueResolver<SourceClass, string> 
{ 
    protected override string ResolveCore(SourceClass source) 
    { 
     if (source.SourceLists.Any()) 
     { 
      foreach (var sourceList in source.SourceLists) 
      { 
       //if the source list Type1 is true, add the value of the list to the value1 
       if (sourceList.Type1.Equals(true)) 
       { 
        var value1 = sourceList.Value.ToString(CultureInfo.InvariantCulture); 
        return value1; 
       } 

       if (sourceList.Type2.Equals(true)) 
       { 
        var value1 = sourceList.Value.ToString(CultureInfo.InvariantCulture); 
        return value1; 
       } 

       if (sourceList.Type3.Equals(true)) 
       { 
        var value1 = sourceList.Value.ToString(CultureInfo.InvariantCulture); 
        return value1; 
       } 
      } 
     } 
     return String.Empty; 
    } 
} 

Die Umsetzung des Kodex ist auf diese Weise:

CreateMap<SourceClass, DestinationClass>() 
    .ForMember(m => m.Value1, o => o.ResolveUsing<Resolver>()) 
    .ForMember(m => m.Value2, o => o.ResolveUsing<Resolver>()) 
    .ForMember(m => m.Value3, o => o.ResolveUsing<Resolver>()); 

ich den Code ändern könnte und einzelne Mapper verwenden zu korrigieren dies jedoch wird dies wiederum das Ziel, mit AutoMapper besiegen.

+0

Sie das gleiche haben if-Anweisung dreimal: if (sourceList.Type1.Equals (true)) Sollte man nicht Typ1 sein, einen Typ2 und ein Typ3? – peinearydevelopment

+0

@peinearydevelopment Ich habe diese Änderung im Code bearbeitet. Es war ein menschlicher Fehler beim Kopieren der Codes. – yuvs

+0

Als Kommentar können Sie Ihren Code ein wenig durch Dinge wie diese bereinigen: if (sourceList.Type2) und Rückgabe sourceList.Value.ToString (CultureInfo.InvariantCulture); Der Auflöser funktioniert nicht, da Sie ein Array von Werten übergeben und die gleiche Aktion für jeden Mitgliedsresolver ausführen. Es gibt nichts in Ihrem Resolver, das besagt, dass Sie versuchen, Value1/2/3 zu erreichen. Es arbeitet jedes Mal auf demselben Array und gibt jedes Mal dieselbe Antwort. Wenn Sie es so machen möchten, benötigen Sie 3 Resolver. ResolverValue1, ResolverValue2, ResolverValue3 (oder so ähnlich). – peinearydevelopment

Antwort

0

Die Art, wie ich dieses Problem gelöst habe, entfernt den Wert jedes Mal, wenn die Bedingung erfüllt ist. Ich habe die RemoveAt-Funktion dazu verwendet.

Meine Lösung

public class Resolver : ValueResolver<SourceClass, string> 
    { 
    protected override string ResolveCore(SourceClass source) 
    { 
     var dc = new DestinationClass(); 
     if (source.SourceLists.Any()) 
     { 
      foreach (var sourceList in source.SourceLists) 
      { 
       //if the source list Type1 is true, add the value of the list to the value1 
       if (sourceList.Type1.Equals(true)) 
       { 
        dc.Value1 = sourceList.Value.ToString(CultureInfo.InvariantCulture); 
        source.SourceLists.RemoveAt(0); 
        return dc.Value1; 
       } 

       if (sourceList.Type2.Equals(true)) 
       { 
        dc.Value2 = sourceList.Value.ToString(CultureInfo.InvariantCulture); 
        source.SourceLists.RemoveAt(0); 
        return dc.Value2; 
       } 

       if (sourceList.Type3.Equals(true)) 
       { 
        dc.Value3 = sourceList.Value.ToString(CultureInfo.InvariantCulture); 
        source.SourceLists.RemoveAt(0); 
        return dc.Value3; 
       } 
      } 
     } 
     return String.Empty; 
    } 
}