调用适当的子类“items”属性

问题描述 投票:0回答:1

我可以知道当在控制器中调用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# inheritance
1个回答
0
投票

这不是继承在 C# 中的工作方式,您无法在

PaginatedItemsDto
中映射并期望映射项目。您应该映射到
FlatPaginatedItemsDto
然后期望拥有项目。事实上,映射值可以分配给它们的基类
PaginatedItemsDto
,但它仍然是
FlatPaginatedItemsDto

所以你的项目没有丢失 - 行为是预期的(唯一映射的东西是来自你的PaginatedItemsDto的属性),你的继承逻辑是错误的。

例如这是可能的:

PaginatedItemsDto items = _mapper.Map<FlatPaginatedItemsDto>(result); 

if (items is FlatPaginatedItemsDto) // this is true
© www.soinside.com 2019 - 2024. All rights reserved.