@@ -71,10 +71,44 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
71
71
return multiSearchDescriptor ;
72
72
73
73
var withMeta = docsJarray . Zip ( this . _descriptor . _Operations , ( doc , desc ) => new MultiHitTuple { Hit = doc , Descriptor = desc } ) ;
74
+ var originalConverters = serializer . Converters . ToList ( ) ;
75
+ var originalResolver = serializer . ContractResolver ;
74
76
foreach ( var m in withMeta )
75
77
{
78
+ bool newConverter = false ;
79
+ if ( m . Descriptor . Value . _Types != null && m . Descriptor . Value . _Types . Count ( ) > 0 && m . Descriptor . Value . _Types . Count ( ) > m . Descriptor . Value . _Types . Where ( x => x . Type == m . Descriptor . Value . _ClrType ) . Count ( ) )
80
+ {
81
+ var typeDict = m . Descriptor . Value . _Types . ToDictionary ( t => t . Resolve ( this . _settings ) , t => t . Type ) ;
82
+ Func < dynamic , Hit < dynamic > , Type > typeSelector = ( o , h ) =>
83
+ {
84
+ Type t ;
85
+ if ( ! typeDict . TryGetValue ( h . Type , out t ) )
86
+ return m . Descriptor . Value . _ClrType ;
87
+ return t ;
88
+ } ;
89
+ serializer . Converters . Clear ( ) ;
90
+ foreach ( var orig in originalConverters )
91
+ {
92
+ if ( ! ( orig is MultiSearchConverter ) )
93
+ serializer . Converters . Add ( orig ) ;
94
+ }
95
+ var converter = new ConcreteTypeConverter ( m . Descriptor . Value . _ClrType , typeSelector ) ;
96
+ serializer . Converters . Add ( converter ) ;
97
+ serializer . ContractResolver = new ElasticContractResolver ( this . _settings ) ;
98
+ ( serializer . ContractResolver as ElasticContractResolver ) . ConcreteTypeConverter = converter ;
99
+ newConverter = true ;
100
+ }
101
+
76
102
var generic = MakeDelegateMethodInfo . MakeGenericMethod ( m . Descriptor . Value . _ClrType ) ;
77
103
generic . Invoke ( null , new object [ ] { m , serializer , response . _Responses , this . _settings } ) ;
104
+
105
+ if ( newConverter )
106
+ {
107
+ serializer . Converters . Clear ( ) ;
108
+ serializer . ContractResolver = originalResolver ;
109
+ foreach ( var converter in originalConverters )
110
+ serializer . Converters . Add ( converter ) ;
111
+ }
78
112
}
79
113
80
114
return response ;
@@ -85,4 +119,4 @@ public override bool CanConvert(Type objectType)
85
119
return objectType == typeof ( MultiSearchResponse ) ;
86
120
}
87
121
}
88
- }
122
+ }
0 commit comments