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;
}
}
}