我可以知道当在控制器中调用PaginatedItemsDto(父级)时如何调用适当的子类“items”属性。仅供参考,PaginatedItemsDto 有两个子类,每个子类都有自己的“items”属性。我需要调用从后端发送的正确的“Items”属性。
请阅读下面控制器类中指定的注释以更好地理解。在控制器中完成映射时,“Items”属性会丢失。我只收到“跳过”和“接受”。映射不适用于子类。谢谢你。
控制器类:
// here I receive correct appropriate child 'Items' and 'skip', 'take' properties
result = await _itemService.GetItemsAsync();
// Here is the issue, 'Items' property gets lost here. I receive only 'skip' and 'take'. So mapping does not work with child class.
return _mapper.Map<PaginatedItemsDto>(result);
支持:
PaginatedItems 类:
public class PaginatedItems
{
public int Skip { get; set; }
public int Take { get; set; }
}
public class GroupedPaginatedItems : PaginatedItems
{
public Dictionary<string, Dictionary<string, List<Item>>>? Items { get; set; }
}
public class FlatPaginatedItems : PaginatedItems
{
public IEnumerable<Item>? Items { get; set; }
}
前端:
PaginatedItemsDTO 类:
public class PaginatedItemsDto
{
public int Skip { get; set; }
public int Take { get; set; }
public class FlatPaginatedItemsDto : PaginatedItemsDto
{
[JsonInclude]
public List<DetailsDto> Items { get; set; } = new();
}
public class GroupedPaginatedItemsDto : PaginatedItemsDto
{
[JsonInclude]
public Dictionary<string, Dictionary<string, List<DetailsDto>>>? Items { get; set; }
}
这不是继承在 C# 中的工作方式,您无法在
PaginatedItemsDto
中映射并期望映射项目。您应该映射到 FlatPaginatedItemsDto
然后期望拥有项目。事实上,映射值可以分配给它们的基类PaginatedItemsDto
,但它仍然是FlatPaginatedItemsDto
。
所以你的项目没有丢失 - 行为是预期的(唯一映射的东西是来自你的PaginatedItemsDto的属性),你的继承逻辑是错误的。
例如这是可能的:
PaginatedItemsDto items = _mapper.Map<FlatPaginatedItemsDto>(result);
if (items is FlatPaginatedItemsDto) // this is true