| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | #nullable enableusing System;using System.Collections;using System.Globalization;using System.Reflection;using System.Text.Json;using System.Text.Json.Serialization;namespace MediaBrowser.Common.Json.Converters{    /// <summary>    /// https://github.com/dotnet/runtime/issues/30524#issuecomment-524619972.    /// TODO This can be removed when System.Text.Json supports Dictionaries with non-string keys.    /// </summary>    internal sealed class JsonNonStringKeyDictionaryConverterFactory : JsonConverterFactory    {        /// <summary>        /// Only convert objects that implement IDictionary and do not have string keys.        /// </summary>        /// <param name="typeToConvert">Type convert.</param>        /// <returns>Conversion ability.</returns>        public override bool CanConvert(Type typeToConvert)        {            if (!typeToConvert.IsGenericType)            {                return false;            }            // Let built in converter handle string keys            if (typeToConvert.GenericTypeArguments[0] == typeof(string))            {                return false;            }            // Only support objects that implement IDictionary            return typeToConvert.GetInterface(nameof(IDictionary)) != null;        }        /// <summary>        /// Create converter for generic dictionary type.        /// </summary>        /// <param name="typeToConvert">Type to convert.</param>        /// <param name="options">Json serializer options.</param>        /// <returns>JsonConverter for given type.</returns>        public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)        {            var converterType = typeof(JsonNonStringKeyDictionaryConverter<,>)                .MakeGenericType(typeToConvert.GenericTypeArguments[0], typeToConvert.GenericTypeArguments[1]);            var converter = (JsonConverter)Activator.CreateInstance(                converterType,                BindingFlags.Instance | BindingFlags.Public,                null,                null,                CultureInfo.CurrentCulture);            return converter;        }    }}
 |