使用 Automapper 将字符串映射到 List<string>,反之亦然

Mapping string to List<string> and vice versa using Automapper

基本上我有这个 class 代表 1:1 我的数据库

public class User
{
    public int UserID { get; set; }
    public string Username { get; set; }
    public string Role { get; set; }
}

我有这个视图模型

public class UserEditViewModel
{
    public UserEditViewModel()
    {
        Roles = new List<string>();
    }

    public int UserID { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    public List<string> Roles { get; set; }
}

我不知道如何在这两个之间映射。我当前的设置:

Mapper.CreateMap<UserEditViewModel, User>().ReverseMap();

这里有类似你的问题,请你看看AutoMapper: Collection to Single string Property

PS:这是一个将集合映射到单个字符串的示例 属性 可能您的示例如下所示;

Mapper.CreateMap<User, UserEditViewModel>()
    .ForMember(dest => dest.Roles,
    m => m.MapFrom(src => src.Role.Split(',').ToList()));

并像下面这样映射实例;

User myUser = new User();
myUser.Role = "r1,r2,r3,r4,r5";
myUser.UserID = 1;
myUser.Username = "MyUserName";

UserEditViewModel result = Mapper.Map<UserEditViewModel>(myUser);

2020 编辑:由于 Expression.Call API 不支持可选参数,您应该将 src.Role.Split(',') 替换为 src.Role.Split(',', System.StringSplitOptions.None)src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)

如果您想连接字符串列表中的所有值,您需要使用 string.Join。在映射器中,您需要使用 ForMember 方法。

UserEditViewModelUser:

Mapper.CreateMap<User, UserEditViewModel>().ForMember(user => user.Role, opt => opt.MapFrom(userEdit => string.Join(", ", userEdit.Roles)));

UserUserEditViewModel:

Mapper.CreateMap<UserEditViewModel, User>().ForMember(userEdit => userEdit.Roles, opt => opt.MapFrom(user => user.Role.Split(",").ToList()));

我认为您应该可以使用 AutoMapper AfterMap,如下所示:

.AfterMap((src,dest) => dest.Roles.Add(src.Role))

此处归功于答案:Map a property to a collection item

将字符串映射到集合 Cihan Uygun 的 答案有效,只是为了修复错误

CS0854 An expression tree may not contain a call or invocation that uses optional arguments

这是在以后的更新中引起的,您应该将 src.Role.Split(',') 替换为 src.Role.Split(',', System.StringSplitOptions.None)src.Role.Split(',', System.StringSplitOptions.RemoveEmptyEntries)

要执行 反向映射 只需使用 src => string.Join(',', src.Roles)

错误修复的来源:https://newbedev.com/mapping-string-to-list-string-and-vice-versa-using-automapper