public void Apply(Schema model, SchemaFilterContext context) { if (!IsBaseOrSubtype(context.SystemType)) { return; } if (context.SystemType == typeof(TBaseType)) { model.Discriminator = "$type"; model.Properties.Add( "$type", new Schema { Enum = TypeNames.Cast <object>().ToArray(), Type = "string" }); if (model.Required == null) { model.Required = new List <string>(); } model.Required.Add("$type"); foreach (var identifierType in SubTypes) { try { context.SchemaRegistry.GetOrRegister(identifierType); } catch (ArgumentException e) { throw new InvalidOperationException($"Cannot included {identifierType} in schema - see inner exception for details", e); } } } else { var schema = new Schema { Properties = model.Properties, Type = model.Type, Required = model.Required }; model.AllOf = new[] { context.SchemaRegistry.GetOrRegister(typeof(TBaseType)), schema }; model.Extensions["x-ms-client-name"] = context.SystemType.FriendlyId(); model.Extensions["x-ms-discriminator-value"] = context.SystemType.FriendlyId(); model.Properties = null; model.Required = null; model.Type = null; } }