ImmutableEnumerableOfTConverter<TCollection, TElement>
sealed class ImmutableEnumerableOfTConverter<TCollection, TElement> : IEnumerableDefaultConverter<TCollection, TElement> where TCollection : IEnumerable<TElement>
using System.Collections.Generic;
namespace System.Text.Json.Serialization.Converters
{
internal sealed class ImmutableEnumerableOfTConverter<TCollection, TElement> : IEnumerableDefaultConverter<TCollection, TElement> where TCollection : IEnumerable<TElement>
{
private Func<IEnumerable<TElement>, TCollection> _creatorDelegate;
internal override bool CanHaveIdMetadata => false;
protected override void Add(TElement value, ref ReadStack state)
{
((List<TElement>)state.Current.ReturnValue).Add(value);
}
protected override void CreateCollection(ref ReadStack state, JsonSerializerOptions options)
{
state.Current.ReturnValue = new List<TElement>();
}
protected override void ConvertCollection(ref ReadStack state, JsonSerializerOptions options)
{
state.Current.ReturnValue = GetCreatorDelegate(options)((List<TElement>)state.Current.ReturnValue);
}
protected override bool OnWriteResume(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, ref WriteStack state)
{
IEnumerator<TElement> enumerator;
if (state.Current.CollectionEnumerator == null) {
enumerator = value.GetEnumerator();
if (!enumerator.MoveNext())
return true;
} else
enumerator = (IEnumerator<TElement>)state.Current.CollectionEnumerator;
JsonConverter<TElement> elementConverter = IEnumerableDefaultConverter<TCollection, TElement>.GetElementConverter(ref state);
do {
if (ShouldFlush(writer, ref state)) {
state.Current.CollectionEnumerator = enumerator;
return false;
}
TElement current = enumerator.Current;
if (!elementConverter.TryWrite(writer, current, options, ref state)) {
state.Current.CollectionEnumerator = enumerator;
return false;
}
} while (enumerator.MoveNext());
return true;
}
private Func<IEnumerable<TElement>, TCollection> GetCreatorDelegate(JsonSerializerOptions options)
{
if (_creatorDelegate == null)
_creatorDelegate = options.MemberAccessorStrategy.CreateImmutableEnumerableCreateRangeDelegate<TElement, TCollection>();
return _creatorDelegate;
}
}
}