c# - 抽象基类列表仅返回基类的属性
问题描述
我有一个与此类似的模型设置。从抽象基类继承的两个类。
// Models
public abstract class Transaction
{
// Shared Properties..
}
public class TransactionType1 : Transaction
{
public int TxType1Prop { get; set;}
}
public class TransactionType2 : Transaction
{
public int TxType2Prop { get; set;}
}
在我的 API 中,我有一个“基类”列表,我用不同的事务类型填充它。当我在返回一切看起来不错之前进行调试时,会填充各个属性等。
// Ctrl
public IAtionResult GetTransactions()
{
var transactions = new list<Transaction>()
{
new TransactionType1(),
new TransactionType2()
}
return Ok(transactions);
}
但是当 Api 调用返回到 swagger 时,只包含来自基类的共享属性。
IE TxType1Prop
&TxType2Prop
不包含在结果中。
是否只能在内存中使用这些属性,或者我可以让我的结果也包含它们?
解决方案
不幸的是,您不能在带有“开箱即用”序列化程序的接口处使用通用基类[这是用于“开箱即用”设置的 - 正如 Ben 提到的,有一些方法可以解决它]。您可以提供一个自定义的 JSON 序列化程序,它可能能够处理这个问题。在我的选择中,即使它正在工作,它也不是最干净的解决方案,因为:
- 您正在公开有关您的应用程序的内部信息(如序列化程序)
- 你放大你的 JSON
- 你降低了可读性
- API 是关于合约的,多态性在一定程度上打破了这一点
您可以在此处阅读有关 API 多态性的更多信息。
在我看来,最好的方法是使用另一种类型的类作为传输对象,它由主要属性和额外的“额外属性”(子类属性)的键值集组成,使用这种方法,你可以发送所有需要的信息(也许你想添加类型信息以便在客户端处理)。
public class TransactionTransport {
// other attributes ommited
// attribute name / attribute value
Map<String, Object> AdditionalValues {get; set;}
}
在这种情况下,您需要AdditionalValues
在 API 中填写子类的属性(将子类映射到TransactionTransport
),一切顺利。
这也会略微降低可读性,但 JSON 中不需要的内容会减少很多。此外,您不会将任何内部的东西暴露在野外。
推荐阅读
- message-queue - [SystemDesign][PriorityInversion] 需要在消息队列中发生优先级反转的示例吗?
- c# - Asp.Net 5 Core DisplayFor() 发布错误
- amazon-web-services - 在 S3 存储桶中隐藏文件源
- node.js - 如何使用节点删除 Mongo 集合中的对象内的对象内的数组元素?
- azure-devops - Azure DevOps - 规则,在状态更改时制作所需的附件
- sql - 如果在某个日期之前没有记录,如何从一个 ID 重复每个下个月的记录?
- flutter - 将叠加在地图上的 GestureDetector 上的点转换为地图上的坐标 (Flutter)
- unreal-engine4 - 虚幻引擎 4 按住一个键让角色不断跳跃
- mysql - Excel for Windows 和 Mac 上 VBA 和 MySQL 之间的兼容性
- javascript - 如何将展开全部按钮添加到 javascript/HTML 项目