使用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));
我知道这不会奏效,但我想这会是一个列表。我真的不知道该何去何从,也不知道是否有可能提供任何帮助。
有几种方法可以实现这一点:
-
将
ConstructUsing
与一些LINQ:一起使用Mapper.CreateMap<Class1, IEnumerable<MyClass>>() .ConstructUsing( src => src.strings.Select(str => new MyClass { someString = str }));
-
使用从
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));
基于评论的更新:
如果源类中有多个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
。这假设每个数组的所有索引都匹配,并且每个数组中的元素数量相同。