我有一个基类,它有两个派生类,并希望将输出的一个字段映射到“one of”语句。
public class ClothingCollection
{
public string Name { get; set; }
public string Id { get; set; }
}
public abstract class ClothingCollection<T> : ClothingCollection
{
public abstract string Type { get; }
public abstract List<T> Stuff { get; }
}
public class PantsCollection : ClothingCollection<PantsModel>
{
public override string Type { get; } = "PANTS";
public override List<PantsModel> Stuff { get; }
}
public class ShirtCollection : BaseItem<ShirtModel>
{
public override string Type { get; } = "SHIRT";
public List<BarChartData> Data { get; }
}
public class PantsModel
{
public bool IsJeans { get; set; }
public string owner { get; set; }
}
public class ShirtModel
{
public string Brand { get; set; }
public int Quantity { get; set; }
}并将控制器响应设置为...
[ProducesResponseType(typeof(List<ClothingCollection>), 200)]
[HttpGet("HelloWorld")]
public IActionResult HelloWorld()
{
....
}现在我希望得到的swagger文档列表看起来有点像下面这样(如果可能的话)
{
"Name": "string",
"Id": "string",
"type": "string",
"Stuff":[
anyof -> PantsCollection,
ShirtCollection
]
}发布于 2021-05-24 23:25:48
在几个固定类型中只有一个值的概念被称为tagged union,区分并集,或者有时称为任一单数。
您可以创建一个具有衬衫或裤子的类:
public class ShirtOrPants
{
public ShirtCollection Shirts { get; }
public PantsCollection Pants { get; }
public ShirtOrPants(ShirtCollection shirts, PantsCollection pants)
{
Shirts = shirts;
Pants = pants;
if ((shirts == null) == (pants == null))
{
throw new InvalidOperationException("Must have shirts OR pants!");
}
}
}据我所知,在c#或任何比较流行的序列化语言中都没有对标记联合的内置支持,因此您需要一些定制的解决方案。您通常会添加各种方法来处理衬衫或裤子,这取决于哪一种方法具有值。
有generic implementations available,但如果目标是提供可读的API定义,它们可能没有多大帮助。
https://stackoverflow.com/questions/67674517
复制相似问题