Automapper 将嵌套列表对象映射到与父对象相同的对象
Automapper Map Nested List Object to Same Object as Parent
我有三个对象,Parent
、Child
和 NewObject
。由于在我弃用 Parent
中的字段时进行了一些中介工作,Child
基本上与 Parent
相同。目前,Parent
映射到 NewObject
就好了,但我还需要将 Parent
内的 Child
对象的内部列表映射到 NewObject
,所以映射 returns NewObject
的列表。下面是一个例子
public class Parent {
public string Code { get; set; }
public string Name { get; set; }
public List<Child> Children { get; set; }
}
public class Child {
public string Code { get; set; }
public string Name { get; set; }
}
public class New {
public string NewCode { get; set; }
public string NewName { get; set; }
}
所以如果我有以下 Parent
对象:
{
"code": "abcd",
"name": "parent",
"children": [
{
"code": "efg",
"name": "child1"
},
{
"code": "xyz",
"name": "child2"
}
]
}
当我把它映射到NewObject
时,结果应该是
[
{
"newCode": "abcd",
"newName": "parent"
},
{
"newCode": "efg",
"newName": "child1"
},
{
"newCode": "xyz",
"newName": "child2"
}
]
有没有办法只使用 Automapper 来做到这一点?还是我需要使用额外的方法?
没有直接的方法可以做到这一点,没有AutoMapper
你可以尝试这样的事情。
public static List<Child> ToNew(Parent parent) {
List<Child> result = parent.Children.ToList();
result.Insert(0, new Child{
Name = parent.Name, Code = parent.Code
});
return result;
}
这将为您提供 List
个 Child
个对象,然后您可以将其映射到 List
个 New
个对象。
CreateMap<List<Child>, List<New>>();
或可以使用AutoMapper
如下。首先将以下映射添加到您的映射配置文件中。
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Parent, List<New>>()
.AfterMap((src, dest, context) => context.Mapper.Map(src.Children, dest));
CreateMap<Child, New>()
.ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
.ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
CreateMap<Parent, New>()
.ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
.ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
}
}
然后使用配置文件创建映射器。
// Manually create the mapper using the Profile
var mapper = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile())).CreateMapper();
现在您可以使用
将Parent
转换为List<New>
var myFlattened = mapper.Map<Parent, List<New>>(parent);
也将父属性映射到 New
,并将其插入第一个列表。
var myFlattenedParent = mapper.Map<Parent, New>(parent);
myFlattened.Insert(0, myFlattenedParent);
完整代码可用here。
我有三个对象,Parent
、Child
和 NewObject
。由于在我弃用 Parent
中的字段时进行了一些中介工作,Child
基本上与 Parent
相同。目前,Parent
映射到 NewObject
就好了,但我还需要将 Parent
内的 Child
对象的内部列表映射到 NewObject
,所以映射 returns NewObject
的列表。下面是一个例子
public class Parent {
public string Code { get; set; }
public string Name { get; set; }
public List<Child> Children { get; set; }
}
public class Child {
public string Code { get; set; }
public string Name { get; set; }
}
public class New {
public string NewCode { get; set; }
public string NewName { get; set; }
}
所以如果我有以下 Parent
对象:
{
"code": "abcd",
"name": "parent",
"children": [
{
"code": "efg",
"name": "child1"
},
{
"code": "xyz",
"name": "child2"
}
]
}
当我把它映射到NewObject
时,结果应该是
[
{
"newCode": "abcd",
"newName": "parent"
},
{
"newCode": "efg",
"newName": "child1"
},
{
"newCode": "xyz",
"newName": "child2"
}
]
有没有办法只使用 Automapper 来做到这一点?还是我需要使用额外的方法?
没有直接的方法可以做到这一点,没有AutoMapper
你可以尝试这样的事情。
public static List<Child> ToNew(Parent parent) {
List<Child> result = parent.Children.ToList();
result.Insert(0, new Child{
Name = parent.Name, Code = parent.Code
});
return result;
}
这将为您提供 List
个 Child
个对象,然后您可以将其映射到 List
个 New
个对象。
CreateMap<List<Child>, List<New>>();
或可以使用AutoMapper
如下。首先将以下映射添加到您的映射配置文件中。
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Parent, List<New>>()
.AfterMap((src, dest, context) => context.Mapper.Map(src.Children, dest));
CreateMap<Child, New>()
.ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
.ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
CreateMap<Parent, New>()
.ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
.ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
}
}
然后使用配置文件创建映射器。
// Manually create the mapper using the Profile
var mapper = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile())).CreateMapper();
现在您可以使用
将Parent
转换为List<New>
var myFlattened = mapper.Map<Parent, List<New>>(parent);
也将父属性映射到 New
,并将其插入第一个列表。
var myFlattenedParent = mapper.Map<Parent, New>(parent);
myFlattened.Insert(0, myFlattenedParent);
完整代码可用here。