'Getting hold of custom attribute property decorations in a Swashbuckle document filter

I’m using Swashbuckle 6.1.4 in a .net 5.0 project.

I want to customise the ordering of the elements in a schema. The default order, i.e. that in which the properties are declared) isn’t good because when models extend a base model, the properties of the base model are listed at the bottom.

I’ve managed to apply a document filter to sort properties alphabetically:

public class SchemaSortingFilter : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        var descs = context.ApiDescriptions.ToList();

     // only applying to the SupporterDTO for now...
        string model = "SupporterDTO";
        if (swaggerDoc.Components.Schemas.ContainsKey(model))
        {
            var props = swaggerDoc.Components.Schemas[model].Properties.OrderBy(x => x.Key).ToArray();
            swaggerDoc.Components.Schemas[model].Properties.Clear();
            foreach (var prop in props)
            {
                swaggerDoc.Components.Schemas[model].Properties.Add(prop.Key, prop.Value);
            }
        }
    }
}

But what I really want is to use a custom attribute to manage the order. Like this:

public class SwaggerOrderAttribute : Attribute
{
   public int Order { get; private set; }

   public SwaggerOrderAttribute(int order)
   {
      Order = order;
   }
}

Which I’d use to decorate properties thus:

[SwaggerOrder(1)]
String PropertyZ {get; set;}
[SwaggerOrder(3)]
String PropertyX {get; set;}
[SwaggerOrder(2)]
String PropertyY {get; set;}

My problem is that the list of attribute values that is exposed in my filter via swaggerDoc.Components.Schemas[model].Properties does not include my custom attributes.

During my explorations, and thanks to a hint in this question I’ve tried to get hold of them like this but it didn’t see them:

if (apiDesc.TryGetMethodInfo(out MethodInfo mi))
{
   var atts = mi.DeclaringType
                .GetCustomAttributes(true)
                .OfType<SwaggerOrderAttribute>()
                .ToList();
}

How do I bring in my custom attributes for inclusion in my sorting linq query?



Solution 1:[1]

You need to implement ISchemaFilter. Then you'll be able to get hold of custom attributes from MemberInfo:

context.MemberInfo.CustomAttributes

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Jeremy Caney