File: System\Text\Json\Serialization\JsonTypeClassifierContext.cs
Web Access
Project: src\src\runtime\src\libraries\System.Text.Json\src\System.Text.Json.csproj (System.Text.Json)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;
using System.Text.Json.Serialization.Metadata;

namespace System.Text.Json.Serialization
{
    /// <summary>
    /// Provides immutable metadata to a <see cref="JsonTypeClassifierFactory"/> when
    /// creating a <see cref="JsonTypeClassifier"/> delegate.
    /// </summary>
    /// <remarks>
    /// <para>
    /// The context carries a <see cref="Kind"/> value indicating whether the classifier
    /// is being created for a union type or a polymorphic type. Exactly one of the two
    /// candidate lists is populated for any given context.
    /// </para>
    /// <para>
    /// Instances are created internally by the serialization infrastructure. Users
    /// interact with the context through a <see cref="JsonTypeClassifierFactory"/>
    /// implementation.
    /// </para>
    /// </remarks>
    public sealed class JsonTypeClassifierContext
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonTypeClassifierContext"/> class.
        /// </summary>
        /// <param name="kind">The type of classifier metadata being configured.</param>
        /// <param name="declaringType">The type being configured for classification.</param>
        /// <param name="unionCases">The union cases of the declaring type, or an empty list.</param>
        /// <param name="derivedTypes">The derived types of the declaring type, or an empty list.</param>
        /// <param name="typeDiscriminatorPropertyName">The JSON property name used for type discrimination, or <see langword="null"/>.</param>
        internal JsonTypeClassifierContext(
            JsonTypeClassifierKind kind,
            Type declaringType,
            IReadOnlyList<JsonUnionCaseInfo> unionCases,
            IReadOnlyList<JsonDerivedType> derivedTypes,
            string? typeDiscriminatorPropertyName)
        {
            Kind = kind;
            DeclaringType = declaringType;
            UnionCases = unionCases;
            DerivedTypes = derivedTypes;
            TypeDiscriminatorPropertyName = typeDiscriminatorPropertyName;
        }

        /// <summary>
        /// Gets the type of classifier metadata being configured.
        /// </summary>
        public JsonTypeClassifierKind Kind { get; }

        /// <summary>
        /// Gets the type being configured for classification.
        /// </summary>
        /// <remarks>
        /// For polymorphic types, this is the base class (e.g., <c>Animal</c>).
        /// For union types, this is the union type (e.g., <c>IntOrString</c>).
        /// </remarks>
        public Type DeclaringType { get; }

        /// <summary>
        /// Gets the union cases of <see cref="DeclaringType"/>.
        /// </summary>
        /// <remarks>
        /// Non-empty when <see cref="DeclaringType"/> is configured as a union type. The
        /// list mirrors <see cref="JsonTypeInfo.UnionCases"/> on the resolved
        /// <see cref="JsonTypeInfo"/>.
        /// </remarks>
        public IReadOnlyList<JsonUnionCaseInfo> UnionCases { get; }

        /// <summary>
        /// Gets the derived types of <see cref="DeclaringType"/>.
        /// </summary>
        /// <remarks>
        /// Non-empty when <see cref="DeclaringType"/> is configured as a polymorphic
        /// type. The list mirrors
        /// <see cref="Metadata.JsonPolymorphismOptions.DerivedTypes"/>; each entry may
        /// carry a <see cref="JsonDerivedType.TypeDiscriminator"/> string or integer.
        /// </remarks>
        public IReadOnlyList<JsonDerivedType> DerivedTypes { get; }

        /// <summary>
        /// Gets the JSON property name used for type discrimination (e.g., <c>"$type"</c>, <c>"kind"</c>).
        /// </summary>
        /// <remarks>
        /// Populated from <see cref="Metadata.JsonPolymorphismOptions.TypeDiscriminatorPropertyName"/>
        /// for polymorphic types. <see langword="null"/> for union types (unions don't use
        /// discriminator properties by default).
        /// </remarks>
        public string? TypeDiscriminatorPropertyName { get; }
    }
}