我遇到了生成泛型类型名的问题。例如,我有以下代码:
public class BulkRequest<T1, T2>
{
public IEnumerable<Operation<T1, T2>> Operations { get; set; }
}
[ProducesResponseType(typeof(BulkRequest<ClassA, ClassB>), StatusCodes.Status200OK)]
在Swagger生成一些丑陋的名称之后,比如:ClassAClassBBulkRequest
和ClassAClassBOperation
。
我不想更改BulkRequest
类,因为它在我们的系统中的多个地方使用。
那么,我们有办法用Swagger生成可读的类名吗?
最后我使用CustomSchemaId
来解决这个问题。也许这对面临类似问题的人有用。
这要归功于一个悬而未决的问题,它为我指明了方向。
我刚刚在Swagger设置中添加了以下CustomSchemaIds
:
services.AddSwaggerGen(c =>
{
// ...
c.CustomSchemaIds(i => {
var typeName = type.Name;
if (!type.GetTypeInfo().IsGenericType) {
return typeName;
}
var genericArgumentIds = type.GetGenericArguments()
.Select(t => t.Name)
.ToArray();
return new StringBuilder(typeName)
.Replace($"`{genericArgumentIds.Count()}", string.Empty)
.Append($"<{string.Join(",", genericArgumentIds).TrimEnd(',')}>")
.ToString();
});
});
在这之后,我得到了我想要的格式:
BulkRequest<ClassA,ClassB>