繁体   English   中英

如何使用自动映射器将列表值映射到字符串?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM