如何将 OpenApi.NET 中的 yaml 扩展解析为 .NET 类?

How to parse extensions of yaml in OpenApi.NET into .NET classes?

我需要为 OpenApi.NET 编写 ExtensionParsers,这样当我解析一个 yaml 文档时,扩展属性(名为 x-something 的属性)被解析成我对应的 C# classes写入而不是通常解析为 OpenApiObject。

因此,例如,当我使用 OpenApi.NET 解析以下 yaml 文档时:

openapi: 3.0.2
info:
  title: 'My interface'
  version: '1.0'
servers:
  - url: https://www.example.com
paths:
  "/student":
    get:
      parameters:
      - name: school
        in: query
        schema:
          type: string
      x-setting:
        name: 'Hello world'
        number: 312
        device: mobile
      responses:
        "200":
          description: Successful
          headers:
            Content-Type:
              schema:
                type: string
          content:
            application/json:
              schema:
                type: string

参数对象被解析为 OpenApiParameter 类型的 C# 对象,名称为字符串类型,In 为 ParameterLocation 类型的枚举,架构为 OpenApiSchema 类型。

但是 x-setting 被解析为 OpenApiObject 类型的 C# 对象,名称被解析为 OpenApiString,数字被解析为 OpenApiInteger,设备被解析为 OpenApiString。

但因为我已经有了以下 c# class:

class Setting
    {
        string Name;
        int Number;
        Device Device;
    }

我希望将其解析为设置类型的 C# 对象,名称为字符串,数字为整数,设备为设备类型的枚举。和参数对象一模一样

有人提到 here 这可以使用 属性 ExtensionParsers 来完成。但不清楚如何。

没有文档,代码注释中的解释也不是很好。那么有人可以帮忙吗?

非常感谢。

您需要提供一个扩展解析器来完成从 OpenApiObject 到本机 C# 的转换 class。例如

 var settings = new OpenApiReaderSettings()
            {
                ExtensionParsers = { { "x-foo", (a,v) => {
                        var fooNode = (OpenApiObject)a;
                        return new FooExtension() {
                              Bar = (fooNode["bar"] as OpenApiString)?.Value,
                              Baz = (fooNode["baz"] as OpenApiString)?.Value
                        };
                } } }
            };

https://github.com/microsoft/OpenAPI.NET/blob/3aeeef600d19e4ecfdf0d116725658b1c496eba0/test/Microsoft.OpenApi.Readers.Tests/TestCustomExtension.cs#L29

抱歉没有文档,不幸的是我没有时间。