これは私が私の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を使用しての目的を打ち負かすこれを修正するために、個々のマッパーを使用することができます。
if文3回: 場合(sourceList.Type1.Equals(真)) 1は、タイプ1、タイプ2 1および1タイプ3をすべきではありませんか? – peinearydevelopment
@peinearydevelopmentコードの変更を編集しました。コードをコピーするのは人間の間違いでした。 – yuvs
コメントとして、次のようなものを通してコードを少しきれいにすることができます。 if(sourceList.Type2) および return sourceList.Value.ToString(CultureInfo.InvariantCulture); 値の配列を渡して各メンバーリゾルバに対して同じアクションを実行するため、リゾルバが動作していません。あなたのリゾルバには、Value1/2/3にマッチさせようとしていることは何もありません。毎回同じアレイ上で動作し、毎回同じ答えを出す。このようにするには、3つのリゾルバが必要です。 ResolverValue1、ResolverValue2、ResolverValue3(またはそのようなもの)。 – peinearydevelopment