<PackageReference Include="System.Text.Json" Version="5.0.0-preview.1.20120.5" />

JsonIEnumerableConverterFactory

using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; namespace System.Text.Json.Serialization.Converters { internal class JsonIEnumerableConverterFactory : JsonConverterFactory { private static readonly IDictionaryConverter<IDictionary> s_converterForIDictionary = new IDictionaryConverter<IDictionary>(); private static readonly IEnumerableConverter<IEnumerable> s_converterForIEnumerable = new IEnumerableConverter<IEnumerable>(); private static readonly IListConverter<IList> s_converterForIList = new IListConverter<IList>(); public override bool CanConvert(Type typeToConvert) { return typeof(IEnumerable).IsAssignableFrom(typeToConvert); } [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ArrayConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ConcurrentQueueOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ConcurrentStackOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.DefaultArrayConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.DictionaryOfStringTValueConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ICollectionOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.IDictionaryOfStringTValueConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.IEnumerableOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.IEnumerableWithAddMethodConverter`1")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.IListConverter`1")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.IListOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ImmutableDictionaryOfStringTValueConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ImmutableEnumerableOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.IReadOnlyDictionaryOfStringTValueConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ISetOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ListOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.QueueOfTConverter`2")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.StackOfTConverter`2")] public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { JsonConverter result = null; Type type = null; Type typeFromHandle; Type compatibleGenericBaseClass; if (typeToConvert.IsArray) { if (typeToConvert.GetArrayRank() > 1) return null; typeFromHandle = typeof(ArrayConverter<, >); type = typeToConvert.GetElementType(); } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericBaseClass(typeof(List<>))) != (Type)null) { typeFromHandle = typeof(ListOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericBaseClass(typeof(Dictionary<, >))) != (Type)null) { Type[] genericArguments = compatibleGenericBaseClass.GetGenericArguments(); if (!(genericArguments[0] == typeof(string))) return null; typeFromHandle = typeof(DictionaryOfStringTValueConverter<, >); type = genericArguments[1]; } else if (typeToConvert.IsImmutableDictionaryType()) { Type[] genericArguments = typeToConvert.GetGenericArguments(); if (!(genericArguments[0] == typeof(string))) return null; typeFromHandle = typeof(ImmutableDictionaryOfStringTValueConverter<, >); type = genericArguments[1]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericInterface(typeof(IDictionary<, >))) != (Type)null) { Type[] genericArguments = compatibleGenericBaseClass.GetGenericArguments(); if (!(genericArguments[0] == typeof(string))) return null; typeFromHandle = typeof(IDictionaryOfStringTValueConverter<, >); type = genericArguments[1]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericInterface(typeof(IReadOnlyDictionary<, >))) != (Type)null) { Type[] genericArguments = compatibleGenericBaseClass.GetGenericArguments(); if (!(genericArguments[0] == typeof(string))) return null; typeFromHandle = typeof(IReadOnlyDictionaryOfStringTValueConverter<, >); type = genericArguments[1]; } else if (typeToConvert.IsImmutableEnumerableType()) { typeFromHandle = typeof(ImmutableEnumerableOfTConverter<, >); type = typeToConvert.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericInterface(typeof(IList<>))) != (Type)null) { typeFromHandle = typeof(IListOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericInterface(typeof(ISet<>))) != (Type)null) { typeFromHandle = typeof(ISetOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericInterface(typeof(ICollection<>))) != (Type)null) { typeFromHandle = typeof(ICollectionOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericBaseClass(typeof(Stack<>))) != (Type)null) { typeFromHandle = typeof(StackOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericBaseClass(typeof(Queue<>))) != (Type)null) { typeFromHandle = typeof(QueueOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericBaseClass(typeof(ConcurrentStack<>))) != (Type)null) { typeFromHandle = typeof(ConcurrentStackOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericBaseClass(typeof(ConcurrentQueue<>))) != (Type)null) { typeFromHandle = typeof(ConcurrentQueueOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if ((compatibleGenericBaseClass = typeToConvert.GetCompatibleGenericInterface(typeof(IEnumerable<>))) != (Type)null) { typeFromHandle = typeof(IEnumerableOfTConverter<, >); type = compatibleGenericBaseClass.GetGenericArguments()[0]; } else if (typeof(IDictionary).IsAssignableFrom(typeToConvert)) { if (typeToConvert == typeof(IDictionary)) return s_converterForIDictionary; typeFromHandle = typeof(IDictionaryConverter<>); } else if (typeof(IList).IsAssignableFrom(typeToConvert)) { if (typeToConvert == typeof(IList)) return s_converterForIList; typeFromHandle = typeof(IListConverter<>); } else if (typeToConvert.IsNonGenericStackOrQueue()) { typeFromHandle = typeof(IEnumerableWithAddMethodConverter<>); } else { if (typeToConvert == typeof(IEnumerable)) return s_converterForIEnumerable; typeFromHandle = typeof(IEnumerableConverter<>); } if (typeFromHandle != (Type)null) { Type type2 = (typeFromHandle.GetGenericArguments().Length != 1) ? typeFromHandle.MakeGenericType(typeToConvert, type) : typeFromHandle.MakeGenericType(typeToConvert); result = (JsonConverter)Activator.CreateInstance(type2, BindingFlags.Instance | BindingFlags.Public, null, null, null); } return result; } } }