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的目的。
你有相同的if語句三次: 如果(sourceList.Type1.Equals(真)) 不應該一個是類型1,2型一個,一個的Type3? – peinearydevelopment
@peinearydevelopment我已經編輯了代碼中的更改。複製代碼是人爲錯誤。 – yuvs
作爲一個評論,你可以像這樣通過東西清理你的代碼位: 如果(sourceList.Type2) 和 回報sourceList.Value.ToString(CultureInfo.InvariantCulture); 解析器無法正常工作,因爲您正在爲每個成員解析器傳遞一組值並對它們執行相同的操作。解析器中沒有任何內容表示您正在嘗試匹配Value1/2/3。它每次都在同一個陣列上運行,並且每次都給出相同的答案。如果你想這樣做,你需要3個解析器。 ResolverValue1,ResolverValue2,ResolverValue3(或類似的東西)。 – peinearydevelopment