Я использую Autorest
для генерации ssharp sdk из определения swagger 2.0, и мне интересно, возможно ли, чтобы сгенерированный дочерний класс переопределил свойство родителя с другим типом.
Пример чванства:
{
"swagger": "2.0",
"info": {
"version": "1",
"title": "My API"
},
"schemes": [
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/myResource": {
"post": {
"parameters": [
{
"name": "myResource_data",
"in": "body",
"schema": {
"$ref": "#/definitions/myResourceCreateBody"
},
"required": true
}
],
"responses": {
"201": {
"description": "myResource response",
"schema": {
"$ref": "#/definitions/myResourceResponseExtended"
}
}
}
}
}
},
"definitions": {
"metaResponse": {
"type": "object",
"description": "Response metadata.",
"required": [
"api_version"
],
"properties": {
"api_version": {
"type": "string"
}
},
"x-services": [
"shared"
]
},
"extendedMetaResponse": {
"allOf": [
{
"$ref": "#/definitions/metaResponse"
},
{
"type": "object",
"properties": {
"myExtendedProp": {
"type": "string"
}
}
}
],
"x-services": [
"shared"
]
},
"myResourceResponse": {
"type": "object",
"required": [
"meta"
],
"additionalProperties": false,
"properties": {
"meta": {
"$ref": "#/definitions/metaResponse"
}
},
"x-services": [
"myResource"
]
},
"myResourceResponseExtended": {
"allOf": [
{
"$ref": "#/definitions/myResourceResponse"
},
{
"type": "object",
"properties": {
"meta": {
"$ref": "#/definitions/extendedMetaResponse"
}
}
}
],
"x-services": [
"myResource"
]
},
"myResourceCreateBody": {
"type": "object",
"required": [
"myResource_id"
],
"additionalProperties": false,
"properties": {
"myResource_id": {
"type": "string",
"description": "myResource identifier"
}
},
"x-services": [
"myResource"
]
}
}
}
, который генерирует следующий базовый класс C #:
public partial class MyResourceResponse
{
public MyResourceResponse()
{
CustomInit();
}
public MyResourceResponse(MetaResponse meta)
{
Meta = meta;
CustomInit();
}
partial void CustomInit();
[JsonProperty(PropertyName = "meta")]
public MetaResponse Meta { get; set; }
public virtual void Validate()
{
if (Meta == null)
{
throw new ValidationException(ValidationRules.CannotBeNull, "Meta");
}
if (Meta != null)
{
Meta.Validate();
}
}
}
}
И следующий дочерний класс:
public partial class MyResourceResponseExtended : MyResourceResponse
{
public MyResourceResponseExtended()
{
CustomInit();
}
public MyResourceResponseExtended(MetaResponse meta)
: base(meta)
{
CustomInit();
}
partial void CustomInit();
public override void Validate()
{
base.Validate();
}
}
Но мой желаемый результат - иметь MyResourceResponseExtended
для переопределения свойства Meta
со свойством Meta
типа MetaResponseExtended
для раскрытия его дополнительных свойств.
Например, мой желаемый результат будет:
public partial class MyResourceResponseExtended : MyResourceResponse
{
[JsonProperty(PropertyName = "meta")]
public new ExtendedMetaResponse Meta { get; set; }
public MyResourceResponseExtended(ExtendedMetaResponse meta)
: base(meta)
{
Meta = meta;
CustomInit();
}
}
Есть ли лучший способ определить это в Swagger 2.0?
Это ошибка / ограничение Autorest?
Спасибо! : -)
PS: я рассмотрел использование discriminator
в файле swagger, но я либо не правильно его использую, либо он не предназначен для этой конкретной цели.