使用automapper将类型字符串列表映射到具有字符串属性的对象列表

时间:2014-10-10 14:44:36

标签: c# automapper

这是我的情景。我有一个类Class1,其属性类型为string []

Class Class1
{
    string[] strings{ get; set;}
}

我希望将列表中的每个字符串映射到MyClass类型列表中的字符串属性。

Class MyClass
{
    string someString { get; set;]
}

所以,使用automapper就是这样的

Mapper.CreateMap<Class1, IEnumerable<MyClass>>().ForMember(dest => dest.someString, opts => opts.MapFrom(src => src.strings));

我知道这不会奏效,但我想这会是一个清单。 我不确定从哪里开始,或者如果有可能,我会非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

有几种方法可以实现这一目标:

  1. 使用ConstructUsing和一些LINQ:

    Mapper.CreateMap<Class1, IEnumerable<MyClass>>()
        .ConstructUsing(
            src => src.strings.Select(str => new MyClass { someString = str }));
    
  2. 使用&#34;内部&#34;从string映射到MyClass并从ConstructUsing调用

    Mapper.CreateMap<string, MyClass>()
        .ConstructUsing(str => new MyClass { someString = str });
    
    Mapper.CreateMap<Class1, IEnumerable<MyClass>>()
        .ConstructUsing(src => Mapper.Map<IEnumerable<MyClass>>(src.strings));
    
  3. 根据评论进行更新

    如果源类中有多个string[]属性,目标类中有多个相应的string属性,则可以执行以下操作:

    Mapper.CreateMap<Class1, IEnumerable<MyClass>>()
        .ConstructUsing(
            src => src.strings
                .Zip(src.strings2, (str1, str2) => new { str1, str2 })
                .Zip(src.strings3, (res1, str3) => 
                    new MyClass 
                    { 
                        someString = res1.str1,
                        someString2 = res1.str2, 
                        someString3 = str3
                    }));
    

    您基本上可以根据需要多次拨打.Zip。这假设所有索引都匹配每个数组,并且每个数组中的元素数量相同。