我成功创建了WorkflowScript: 30: expecting anything but ''\n''; got it anyway @ line 30, column 102.
target/serenity-summary.html")
^
1 error
,以扩展{em> swagger.json 枚举属性定义,以实现here所述的代码生成目的。这是我当前的ISchemaFilter
方法:
SchemaFilter.Apply
public void Apply(Schema schema, SchemaFilterContext context)
{
if (context.SystemType.IsEnum)
{
var names = Enum.GetNames(context.SystemType);
var values = Enum.GetValues(context.SystemType);
var desc = "";
foreach (var value in values)
{
var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
desc += $"{intValue}={value},";
}
desc = desc.TrimEnd(',');
schema.Extensions.Add("x-enumNames", names);
schema.Extensions["description"] = desc;
}
}
可以在我的模型定义中正常工作,其中模型类具有具有枚举类型的成员。以下是输出示例:SchemaFilter
-字段,它是枚举类型,请注意自定义resolution
和修改后的x-enumNames
字段:
description
问题在于resolution: {
format: "int32",
enum: [
1,
2,
3,
4
],
type: "integer",
x-enumNames: [
"Hour",
"Day",
"Month",
"Year"
],
description: "1=Hour,2=Day,3=Month,4=Year"
}
不会扩展操作参数中的枚举类型。例如,以下api方法具有参数SchemaFilter
:
resolution
这将对swagger.json生成以下操作参数定义(注意缺少public async Task<ActionResult<ReturnType>> GetData(Models.ResolutionEnum resolution)
):
x-EnumNames
有什么方法可以扩展作为方法参数一部分的招摇枚举方案吗?
答案 0 :(得分:1)
尝试使用IDocumentFilter,我已经使用它注入了x-stuff
,这是一个示例:
public class InjectXStuff : IDocumentFilter
{
public void Apply(SwaggerDocument s, DocumentFilterContext c)
{
PathItem path = s.Paths.Where(x => x.Key.Contains("Values")).First().Value;
path.Post.Parameters.FirstOrDefault().Extensions.Add("x-stuff", "123456");
}
}
问题在于您需要了解高级路径,不确定是否可以在代码中使用某种模式来识别那些枚举...
答案 1 :(得分:1)
感谢another answer在这个问题下,我发现Swashbuckle.AspNetCore.SwaggerGen
命名空间中有多个扩展点。 IParameterFilter
正是我想要的,我能够将x-enumNames
注入到方法参数定义中。
以下是我制作的参数过滤器:
public class ModifyParametersFilter : IParameterFilter
{
public void Apply(IParameter parameter, ParameterFilterContext context)
{
var type = context.ParameterInfo?.ParameterType;
if (type == null)
return;
if (type.IsEnum)
{
var names = Enum.GetNames(type);
var values = Enum.GetValues(type);
var desc = "";
foreach (var value in values)
{
var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
desc += $"{intValue}={value},";
}
desc = desc.TrimEnd(',');
if (!parameter.Extensions.ContainsKey("x-enumNames"))
parameter.Extensions.Add("x-enumNames", names);
}
}
}
与其他过滤器一样,可以使用以下代码段在Startup.cs
中激活它:
services.AddSwaggerGen(c =>
{
..
c.ParameterFilter<ModifyParametersFilter>();
}