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

本文关键字:字符串 列表 属性 对象 映射 automapper 类型 使用 | 更新日期: 2023-09-27 18:26:08

这是我的场景。我有一个类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));

我知道这不会奏效,但我想这会是一个列表。我真的不知道该何去何从,也不知道是否有可能提供任何帮助。

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

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

  1. ConstructUsing与一些LINQ:一起使用

    Mapper.CreateMap<Class1, IEnumerable<MyClass>>()
        .ConstructUsing(
            src => src.strings.Select(str => new MyClass { someString = str }));
    
  2. 使用从stringMyClass的"内部"映射,并从ConstructUsing:调用

    Mapper.CreateMap<string, MyClass>()
        .ConstructUsing(str => new MyClass { someString = str });
    Mapper.CreateMap<Class1, IEnumerable<MyClass>>()
        .ConstructUsing(src => Mapper.Map<IEnumerable<MyClass>>(src.strings));
    

基于评论的更新

如果源类中有多个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。这假设每个数组的所有索引都匹配,并且每个数组中的元素数量相同。