Ilya Loskutov
Ilya Loskutov

Reputation: 2201

Automapper: how to map many members using a property of source type?

// source classes
public class User 
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class UserStatus 
{
    public User User { get; set; }
    public int Status { get; set; }
}

// dest classes
public class UserVM 
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class UserStatusVM : UserVM 
{
    public int Status { get; set; }
}

//Automapper configuration
c.CreateMap<User, UserVM>();
c.CreateMap<UserStatus, UserStatusVM>()
  .ForMember(dest => dest.Status, opt => opt.MapFrom(source => source.Status))
  .ForAllOtherMembers(opt => opt.ResolveUsing(source => Mapper.Map<User, UserVM>(source.User))); // error there

My target is all members (excluding Status one) of UserStatusVM were mapped from User property of UserStatus class just as if it's mapping Users -> UserVM.

How can I achieve it? Is something like ForMember(dest => dest.Id, opt => opt.MapFrom(source => source.User.Id)) etc. the only solution?

Upvotes: 0

Views: 53

Answers (1)

tchelidze
tchelidze

Reputation: 8308

Rename UserVM's properties

public class UserVM 
{
    public string UserId { get; set; }
    public string UserName { get; set; }
}

UserId and UserName will be mapped by convention from UserStatus.User.Id and UserStatus.User.Name respectively.

Note

While mapping, Automapper sees that UserVM.UserId does not exits on UserStatus type, so it splits UserId into User and Id (by CamelCase) and maps UserVM.UserId from UserStatus.User.Id

Upvotes: 1

Related Questions