2016-08-05 108 views
0

這是我的DTO模型對象如何使用Automapper將列表值映射到字符串?

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; } 
} 

我映射到我的視圖模型

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

} 

用我自己的解析方法。 如果Dto列表的對應bool爲true,則目標是將值映射到List到ViewModel值。

例如, 如果列表包含IsValue1爲true,則需要使用來自IsValue1的值更新viewModel Value1。

它當前正在更新viewModel中具有相同值的所有屬性的值,即Value1,Value2和Value3具有相同的value1值。因爲它查找條件IsValue1,在dto中爲true,除非我刪除該值。

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; 
    } 
} 

代碼的實現是這樣:

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>()); 

我可以改變的代碼,並使用單獨的映射來糾正這種但是這又會破壞使用Automapper的目的。

+0

你有相同的if語句三次: 如果(sourceList.Type1.Equals(真)) 不應該一個是類型1,2型一個,一個的Type3? – peinearydevelopment

+0

@peinearydevelopment我已經編輯了代碼中的更改。複製代碼是人爲錯誤。 – yuvs

+0

作爲一個評論,你可以像這樣通過東西清理你的代碼位: 如果(sourceList.Type2) 和 回報sourceList.Value.ToString(CultureInfo.InvariantCulture); 解析器無法正常工作,因爲您正在爲每個成員解析器傳遞一組值並對它們執行相同的操作。解析器中沒有任何內容表示您正在嘗試匹配Value1/2/3。它每次都在同一個陣列上運行,並且每次都給出相同的答案。如果你想這樣做,你需要3個解析器。 ResolverValue1,ResolverValue2,ResolverValue3(或類似的東西)。 – peinearydevelopment

回答

0

我已經解決這個問題的方法是每次滿足條件時刪除該值。我已經使用RemoveAt函數來完成它。

我的解決方案

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; 
    } 
} 
相關問題