/// <summary> /// Creates a new instance of the <see cref="VisitorCollection"/> class by scanning the current assembly for <see cref="IVisitor"/>. /// </summary> /// <remarks> /// There is an expectation that the <see cref="IVisitor"/> implementation has a constructor that takes a <see cref="VisitorCollection"/> as the only parameter. /// </remarks> /// <returns>Returns the <see cref="VisitorCollection"/> instance.</returns> public static VisitorCollection CreateInstance() { var collection = new VisitorCollection(); collection.Visitors = typeof(IVisitor).Assembly .GetTypes() .Where(p => p.Name.EndsWith("Visitor") && p.IsClass && !p.IsAbstract) .Select(p => (IVisitor)Activator.CreateInstance(p, collection)).ToList(); // NOTE: there is no direct enforcement on the constructor arguments of the visitors return(collection); }
/// <inheritdoc /> public void Accept(VisitorCollection collection, NamingStrategy namingStrategy) { // Checks the properties only. if (this.Properties.Any()) { foreach (var property in this.Properties) { var attributes = new List <Attribute> { property.Value.GetCustomAttribute <OpenApiSchemaVisibilityAttribute>(inherit: false), property.Value.GetCustomAttribute <OpenApiPropertyAttribute>(inherit: false), }; attributes.AddRange(property.Value.GetCustomAttributes <ValidationAttribute>(inherit: false)); foreach (var visitor in collection.Visitors) { if (!visitor.IsVisitable(property.Value.PropertyType)) { continue; } var type = new KeyValuePair <string, Type>(property.Key, property.Value.PropertyType); visitor.Visit(this, type, namingStrategy, attributes.ToArray()); } } return; } // Checks the types only. foreach (var type in this.Types) { foreach (var visitor in collection.Visitors) { if (!visitor.IsVisitable(type.Value)) { continue; } visitor.Visit(this, type, namingStrategy); } } }
/// <inheritdoc /> public DateTimeObjectTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <summary> /// Initializes a new instance of the <see cref="TypeVisitor"/> class. /// </summary> /// <param name="visitorCollection"><see cref="VisitorCollection"/> instance.</param> protected TypeVisitor(VisitorCollection visitorCollection) { this.VisitorCollection = visitorCollection.ThrowIfNullOrDefault(); }
/// <inheritdoc /> public ByteArrayTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public ByteEnumTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public SingleTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public Int64TypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public Int16EnumTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public StringTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public DoubleTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public BooleanTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public RecursiveObjectTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public UInt16TypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public NullableObjectTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public UriTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public DecimalTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public ObjectTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }
/// <inheritdoc /> public ExceptionTypeVisitor(VisitorCollection visitorCollection) : base(visitorCollection) { }