[英]How to Map List Values to String using Automapper?
这是我的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; }
}
我正在映射到我的ViewModel
public class DestinationClass
{
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
}
使用我自己的解析器方法。 目的是如果Dto列表具有相应的布尔值,则将值映射到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的目标。
我解决此问题的方法是在每次满足条件时都删除该值。 我已经使用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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.