// 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.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Text.Json.Reflection; using System.Text.Json.Serialization.Converters; namespace System.Text.Json.Serialization { /// <summary> /// Converter for streaming <see cref="IAsyncEnumerable{T}" /> values. /// </summary> [RequiresDynamicCode(JsonSerializer.SerializationRequiresDynamicCodeMessage)] internal sealed class IAsyncEnumerableConverterFactory : JsonConverterFactory { public IAsyncEnumerableConverterFactory() { } public override bool CanConvert(Type typeToConvert) => GetAsyncEnumerableInterface(typeToConvert) is not null; public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { Type? asyncEnumerableInterface = GetAsyncEnumerableInterface(typeToConvert); Debug.Assert(asyncEnumerableInterface is not null, $"{typeToConvert} not supported by converter."); Type elementType = asyncEnumerableInterface.GetGenericArguments()[0]; Type converterType = typeof(IAsyncEnumerableOfTConverter<,>).MakeGenericType(typeToConvert, elementType); return (JsonConverter)Activator.CreateInstance(converterType)!; } private static Type? GetAsyncEnumerableInterface(Type type) => type.GetCompatibleGenericInterface(typeof(IAsyncEnumerable<>)); } } |