如何在 .NET Swagger 中为枚举添加详细的描述,同时避免这些描述在文档中直接显示出来?
时间: 2024-11-12 21:44:55 浏览: 60
在.NET Swagger(现称为OpenAPI)中,为了为枚举添加详细描述并在文档中隐藏这些描述,你需要在Swagger元数据中进行一些配置。以下是如何操作:
1. 首先,在你的枚举类型上添加注解。例如,你可以使用`[SwaggerEnumDescription]`或`[ApiDocumentation]`来自定义描述。这通常会将描述存储在一个单独的地方,而不是直接暴露给用户。
```csharp
public enum MyEnum
{
[SwaggerEnumDescription("这是第一个选项")]
OptionOne,
[SwaggerEnumDescription("这是第二个选项")]
OptionTwo,
// 如果你想让某个值不显示描述,可以忽略这个注解
[SwaggerEnumDescription("")]
NoDescriptionOption
}
```
2. 在`.cs`文件的顶部,你可以创建一个单独的类来包含所有枚举类型的描述,如`SwaggerEnumDescriptions.cs`:
```csharp
namespace YourNamespace
{
public static class SwaggerEnumDescriptions
{
public const string MyEnumOptionOne = "这是第一个选项";
public const string MyEnumOptionTwo = "这是第二个选项";
}
}
```
3. 然后,在生成Swagger元数据的部分,你可以引用这个类来获取描述,而不会直接暴露到OpenAPI文档中。在`Startup.cs`中的`ConfigureServices`方法里,添加对`SwaggerGen`的帮助服务,以及一个自定义的`IModelFilter`来处理枚举描述:
```csharp
services.AddSwaggerGen(c =>
{
c.DocumentFilter<HideEnumDescriptionsDocumentFilter>();
// ... 其他SwaggerGen配置
});
```
4. 创建一个名为`HideEnumDescriptionsDocumentFilter`的类,该类可以从模型中移除枚举的描述字段:
```csharp
public class HideEnumDescriptionsDocumentFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.ParameterTypes.Any(p => p.ModelType == typeof(Enum)))
{
var modelType = p.ModelType;
var modelDefinition = context.ApiDescription.ModelMetadata.Properties.First(p => p.ModelType == modelType);
modelDefinition.Description = null; // 移除默认描述
}
}
}
```
阅读全文