如何从.NET 5控制器返回基类对象及其子类型属性的列表。
public class StepBaseDto
{
public string Title { get; set; }
public int Order { get; set; }
public StepType StepType { get; set; }
public bool IsDone { get; set; }
public string Description { get; set; }
public string PropertyLabel { get; protected set; }
public Guid ProtocolId { get; set; }
public List<SubStepDto> SubSteps { get; set; }
}
public class StartDateStepDto : StepBaseDto
{
public DateTime? StartingDate { get; set; }
}
public class ProtocolDto : ProtocolBaseDto
{
public List<StepBaseDto > StepSequence { get; set; }
}
终点:
public override Task<ProtocolDto> GetAsync(Guid id)
在返回ProtocolDto及其StepBaseDto列表时,我无法在JSON结果中看到派生类的属性。
但是如果我改变了
public class ProtocolDto : ProtocolBaseDto
{
public List<object> StepSequence { get; set; }
}
是否有方法可以在不将StepBaseDto更改为object的情况下实现相同的结果?
编辑:我正在使用自动Map器
我发现了一个与这个问题相关的问题:Derived type's properties missing in JSON response from ASP.NET Core API
但该解决方案对我不起作用,我使用的是ABP Framework 5.3.4
When using List
When using List
通过使用dynamic而不是基类修复了它
2条答案
按热度按时间rekjcdws1#
您看不到子类别属性,因为您说它是基底类别的清单。任何指涉该清单的程式码也会认为它们是基底类别。您可以:
1.使列表成为子类列表,或者
1.每次要访问那些子类属性时都要进行类型转换,或者
1.将子类属性移到接口并使用接口列表,或
1.将子类属性移到基类中。
我认为你遇到的问题是,如果你试图访问子类的属性,你实际上并不需要一个基类的列表。因为你的子类只是添加了一个可空属性,我认为你可以把它放在基类中,而不破坏任何东西--没有属性的对象将其保留为空,有属性的对象可以设置字段。
我不清楚你是如何尝试访问它的,它应该如何使用,等等,所以很难给予你更好的指导。
k97glaaz2#
解决方案; Microsoft.Text.Json〈V6不支持多态性,我们必须使用Newtonsoft Json解析器。或者你必须切换到V7,这对我来说是不可能的。
完整说明如下:https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism?pivots=dotnet-7-0
他们强迫我们使用Object或者切换回Newtonsoft
编辑:一个好的解决方法是使用dynamic而不是基类