How can I customize the non-generic class names in generated Swagger files?

Viewed 185

I faced with problem with swagger generation of generic type names. For example I have the following code:

public class BulkRequest<T1, T2>
{
    public IEnumerable<Operation<T1, T2>> Operations { get; set; }
}

[ProducesResponseType(typeof(BulkRequest<ClassA, ClassB>), StatusCodes.Status200OK)]

And after Swagger generates some ugly names like: ClassAClassBBulkRequest and ClassAClassBOperation.

I don't want to change BulkRequest class because it used in multiple places in our system.

So do we have any way to generate readable class names with Swagger?

1 Answers

Finally I used CustomSchemaId to solve this issue. Maybe it will be useful for someone who is facing a similar problem.

Credit to an opened issue, which pointed me in this direction.

I just added the following CustomSchemaIds in Swagger settings:

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();
    });
});

And after this, I got type in format that I was looking for:

BulkRequest<ClassA,ClassB>
Related