После того, как я искал целую вечность, мне пришлось немного испортить решение. Используя ISchemaNameGenerator, замените нежелательные имена на что-то другое (я заменяю «.» На «_»). Затем с помощью PostProcess удалите их из сгенерированной схемы. ExcludedTypeNames по какой-то причине не работает.
var excludedList = new List<string>();
// this is called first
settings.SchemaNameGenerator = new SchemaNameGenerator(x =>
{
if (!typeNamespaces.Any(n => x.FullName.StartsWith(n)))
{
excludedList.Add(x.FullName);
}
return !typeNamespaces.Any(n => x.FullName.StartsWith(n));
});
// Post process relies on excluded list, otherwise it won't work
settings.PostProcess = (doc) =>
{
foreach (var exItem in excludedList)
{
var formatted = exItem.Replace(".", "_");
if (doc.Definitions.ContainsKey(formatted))
{
doc.Definitions.Remove(formatted);
}
}
};
SchemaNameGenerator:
public class SchemaNameGenerator : ISchemaNameGenerator
{
private Func<Type, bool> excludePredicate;
public SchemaNameGenerator(Func<Type, bool> excludePredicate = null)
{
this.excludePredicate = excludePredicate;
}
public string Generate(Type type)
{
var displayAttr = type
.GetCustomAttributes(typeof(DisplayNameAttribute), true)
.Cast<DisplayNameAttribute>()
.FirstOrDefault();
if (excludePredicate != null)
{
if (excludePredicate(type))
{
return type.FullName.Replace(".", "_");
}
}
return displayAttr?.DisplayName ?? type.Name;
}
}
Если у кого-то есть идея получше, пожалуйста, дайте мне знать.