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