I'm having difficulties getting all members mapped in the following scenario:
I have a class that inherits from List<T>
:
public class PagedList<T> : List<T>
{
public int CurrentPage { get; private set; }
public int TotalPages { get; private set; }
public int PageSize { get; private set; }
public int TotalCount { get; private set; }
public bool HasPrevious => CurrentPage > 1;
public bool HasNext => CurrentPage < TotalPages;
public PagedList(List<T> items, int count, int pageNumber, int pageSize)
{
TotalCount = count;
PageSize = pageSize;
CurrentPage = pageNumber;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
AddRange(items);
}
public PagedList()
{
//default constructor added because Mapster complained about missing default constructor
}
public static async Task<PagedList<T>> ToPagedListAsync(IQueryable<T> source, int pageNumber, int pageSize, CancellationToken cancellationToken = default)
{
var count = source.Count();
var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync(cancellationToken);
return new PagedList<T>(items, count, pageNumber, pageSize);
}
}
Implementation:
public async Task<PagedList<UserDTO>> GetAllAsync(UserParameters userParameters, CancellationToken cancellationToken = default)
{
PagedList<User> users = await _repositoryManager.UserRepository.GetAllAsync(userParameters, cancellationToken);
//users.Count = 5
//users.TotalPages = 10
TypeAdapterConfig<PagedList<User>, PagedList<UserDTO>>.NewConfig()
.IncludeMember((member, side) => member.AccessModifier == AccessModifier.Internal ||
member.AccessModifier == AccessModifier.ProtectedInternal);
PagedList<UserDTO> usersDTO = users.Adapt<PagedList<UserDTO>>();
//usersDTO.Count = 5
//BUT usersDTO.TotalPages = 0 (should be 10)
return usersDTO;
}
In the above scenario, the items of the inherited List<User>
list in PagedList<User>
are converted properly, whereas the other members, i.e. CurrentPage
, TotalPages
, PageSize
, TotalCount
, HasPrevious
and HasNext
are not.
I tried to configure Mapster to include also hidden members, but to no avail:
TypeAdapterConfig<PagedList<User>, PagedList<UserDTO>>.NewConfig()
.IncludeMember((member, side) => member.AccessModifier == AccessModifier.Internal ||
member.AccessModifier == AccessModifier.ProtectedInternal);
How do I go about to make this conversion work?