C# 使用automapper将string类型列表映射到具有string属性的对象列表

C# 使用automapper将string类型列表映射到具有string属性的对象列表,c#,automapper,C#,Automapper,这是我的设想。我有一个类Class1,其属性类型为string[] Class Class1 { string[] strings{ get; set;} } 我想将列表中的每个字符串映射到MyClass类型列表中的字符串属性 Class MyClass { string someString { get; set;] } 所以,使用automapper它会是这样的 Mapper.CreateMap<Class1, IEnumerable<MyClass>&

这是我的设想。我有一个类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));
Mapper.CreateMap().formMember(dest=>dest.someString,opts=>opts.MapFrom(src=>src.strings));
我知道这不管用,但我想应该是这个清单上的东西。
我真的不知道该从这里走到哪里,或者是否可能,我们非常感谢您的帮助。

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

  • 使用
    ConstructUsing
    和一些LINQ:

    Mapper.CreateMap<Class1, IEnumerable<MyClass>>()
        .ConstructUsing(
            src => src.strings.Select(str => new MyClass { someString = str }));
    
  • 根据评论更新:

    如果源类中有多个
    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
                    }));
    
    Mapper.CreateMap()
    .施工(
    src=>src.strings
    .Zip(src.strings2,(str1,str2)=>new{str1,str2})
    .Zip(src.strings3,(res1,str3)=>
    新MyClass
    { 
    someString=res1.str1,
    someString2=res1.str2,
    someString3=str3
    }));
    

    基本上,您可以多次调用
    .Zip
    。这假设每个数组的所有索引都匹配,并且每个数组中的元素数都相同。

    @Chris:没问题,很高兴我能提供帮助。作为跟进,对于同一类中的多个属性,您将如何做到这一点?在源或目标中?如果你更新你的问题,我很乐意看一看源class1,它包含n个string[]类型的属性,我想把它们映射到一个MyClass列表中,该列表包含n个string类型的属性。我用一个自定义的解析器解决了这个问题,但我觉得不用这样做也可以做到。@Chris:我更新了我的答案。如果属性的数量很大,您可能需要查看自定义解析器
    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
                    }));