2016-08-05 6 views
0

これは私が私のViewModelに私自身のリゾルバメソッドを使用してAutomapperを使用してリスト値を文字列にマップする方法は?

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

} 

にマッピングしています私のDTOモデルオブジェクト

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

です。 Dtoリストに対応するboolがtrueの場合、List to ViewModel値に値をマップすることが目的です。

たとえば、リストに含まれるIsValue1がtrueの場合、ViewModelのValue1をIsValue1からのValueで更新する必要があります。

現在、同じ値を持つviewModelのすべてのプロパティの値を更新しています。つまり、Value1、Value2、およびValue3の値はvalue1と同じです。値を削除しない限り、dtoでtrueの条件IsValue1が検索されます。

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文3回: 場合(sourceList.Type1.Equals(真)) 1は、タイプ1、タイプ2 1および1タイプ3をすべきではありませんか? – peinearydevelopment

+0

@peinearydevelopmentコードの変更を編集しました。コードをコピーするのは人間の間違いでした。 – yuvs

+0

コメントとして、次のようなものを通してコードを少しきれいにすることができます。 if(sourceList.Type2) および return 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; 
    } 
} 
関連する問題