public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (this._request == null)
            {
                var realConverter = serializer.GetStatefulConverter <MultiGetHitJsonConverter>();
                return(realConverter.ReadJson(reader, objectType, existingValue, serializer));
            }

            var response   = new MultiGetResponse();
            var jsonObject = JObject.Load(reader);

            var docsJarray = (JArray)jsonObject["docs"];

            if (this._request == null || docsJarray == null)
            {
                return(response);
            }

            var withMeta = docsJarray.Zip(this._request.Documents, (doc, desc) => new MultiHitTuple {
                Hit = doc, Descriptor = desc
            });

            foreach (var m in withMeta)
            {
                var generic = MakeDelegateMethodInfo.MakeGenericMethod(m.Descriptor.ClrType);
                generic.Invoke(null, new object[] { m, serializer, response._Documents });
            }

            return(response);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (this._request == null)
            {
                var realConverter = serializer.GetStatefulConverter <MultiGetHitJsonConverter>();
                return(realConverter.ReadJson(reader, objectType, existingValue, serializer));
            }

            var response   = new MultiGetResponse();
            var jsonObject = JObject.Load(reader);
            var docsJarray = (JArray)jsonObject["docs"];

            if (this._request == null || docsJarray == null)
            {
                return(response);
            }

            var withMeta = docsJarray.Zip(this._request.Documents, (doc, desc) => new MultiHitTuple {
                Hit = doc, Descriptor = desc
            });

            foreach (var m in withMeta)
            {
                var cachedDelegate = serializer.GetConnectionSettings().Inferrer.CreateMultiHitDelegates.GetOrAdd(m.Descriptor.ClrType, t =>
                {
                    // Compile a delegate from an expression
                    var methodInfo           = MakeDelegateMethodInfo.MakeGenericMethod(t);
                    var tupleParameter       = Expression.Parameter(typeof(MultiHitTuple), "tuple");
                    var serializerParameter  = Expression.Parameter(typeof(JsonSerializer), "serializer");
                    var multiHitCollection   = Expression.Parameter(typeof(ICollection <IMultiGetHit <object> >), "collection");
                    var parameterExpressions = new[] { tupleParameter, serializerParameter, multiHitCollection };
                    var call   = Expression.Call(null, methodInfo, parameterExpressions);
                    var lambda = Expression.Lambda <Action <MultiHitTuple, JsonSerializer, ICollection <IMultiGetHit <object> > > >(call, parameterExpressions);
                    return(lambda.Compile());
                });

                cachedDelegate(m, serializer, response.InternalHits);
            }

            return(response);
        }