我有课程:
public class Person{ /* Props here */ }
public class PersonViewModel { /* Props here */ }
然后是清单:
List<Person> people = new List<Person>();
List<PersonViewModel> peopleVM = Mapper
.MapList<Person, PersonViewModel>(people); //Problem here.
这样做的正确方法是什么?
答案 0 :(得分:70)
Mapper.CreateMap<Person, PersonViewModel>();
peopleVM = Mapper.Map<List<Person>, List<PersonViewModel>>(people);
Mapper.AssertConfigurationIsValid();
如何使用AutoMapper?
首先,您需要使用源和目标类型。目标类型的设计可能受其所在层的影响,但只要成员的名称与源类型的成员匹配,AutoMapper就能发挥最佳效果。如果您有一个名为“FirstName”的源成员,则会自动将其映射到名为“FirstName”的目标成员。 AutoMapper还支持Flattening,它可以摆脱你可能遇到的所有那些讨厌的空引用异常。
获得类型和AutoMapper参考后,您可以为这两种类型创建地图。
Mapper.CreateMap<Order, OrderDto>();
左侧的类型是源类型,右侧的类型是目标类型。要执行映射,请使用Map方法。
OrderDto dto = Mapper.Map<Order, OrderDto>(order);
答案 1 :(得分:18)
另一种解决方案
List<Person> people = new List<Person>();
List<PersonViewModel> peopelVM;
peopelVM = people.Select(Mapper.Map<Person, PersonViewModel>);
在Automapper配置中
Mapper.CreateMap<Person, PersonViewModel>();
答案 2 :(得分:14)
如果您在此处使用IQueryable列表(例如,来自EF或NH),您可以使用AutoMapper.IQueryableExtensions方法,Project()和To()。
这是我第一次使用AutoMapper,但我正在成功为这个模型创建一个地图:
Mapper.CreateMap<Person, PersonViewModel>();
Mapper.AssertConfigurationIsValid();
然后使用IQueryableExtension方法Project()和To():
using AutoMapper.QueryableExtensions;
...
IQueryable<Person> people = new List<Person>().AsQueryable(); //actually from ORM
IQueryable<PersonViewModel> peopleVM = people.Project().To<PersonViewModel>();
答案 3 :(得分:1)
在核心1.1中,此扩展可能有效:
public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
{
return source.Select(x => mapper.Map<TDestination>(x)).ToList();
}
答案 4 :(得分:0)
您可以使用现有的单个项目映射创建一个扩展方法来执行此类操作:
client.nodes.list(filters={'role': 'manager'})
用法:
public static class AutoMapperExtensions
{
public static List<TDestination> MapList<TSource, TDestination>(this IMapper mapper, List<TSource> source)
{
return mapper.Map<List<TDestination>>(source);
}
}
答案 5 :(得分:0)
public IActionResault Index(List<User> users)
{
List<VM_User> vM_users=new List<VM_User>();
vM_users=mapper.Map(users,vM_users);
return view(vM_users);
}
答案 6 :(得分:0)
另一种解决方案
_createNewUserAsAdmin(email, password){
var adminPass = SharedPreferences.adminPass;
var adminEmail = SharedPreferences.adminEmail;
_auth.logout();
var newUser= _auth.createUser(email, password);
if(newUser == null){} //error creating user (user object is null), handle error and log back into admin
else{
_auth.logout()(
_auth.signIn(adminEmail, adminPass);
}
}