1- /* Copyright 2010-2016 MongoDB Inc.
1+ /* Copyright 2010-2017 MongoDB Inc.
22*
33* Licensed under the Apache License, Version 2.0 (the "License");
44* you may not use this file except in compliance with the License.
@@ -70,16 +70,22 @@ public sealed class RenderedFieldDefinition<TField>
7070 {
7171 private readonly string _fieldName ;
7272 private readonly IBsonSerializer < TField > _fieldSerializer ;
73+ private readonly IBsonSerializer _underlyingSerializer ;
74+ private readonly IBsonSerializer < TField > _valueSerializer ;
7375
7476 /// <summary>
7577 /// Initializes a new instance of the <see cref="RenderedFieldDefinition{TField}" /> class.
7678 /// </summary>
7779 /// <param name="fieldName">The field name.</param>
7880 /// <param name="fieldSerializer">The field serializer.</param>
79- public RenderedFieldDefinition ( string fieldName , IBsonSerializer < TField > fieldSerializer )
81+ /// <param name="valueSerializer">The value serializer.</param>
82+ /// <param name="underlyingSerializer">The underlying serializer.</param>
83+ public RenderedFieldDefinition ( string fieldName , IBsonSerializer < TField > fieldSerializer , IBsonSerializer < TField > valueSerializer , IBsonSerializer underlyingSerializer )
8084 {
8185 _fieldName = Ensure . IsNotNull ( fieldName , nameof ( fieldName ) ) ;
82- _fieldSerializer = Ensure . IsNotNull ( fieldSerializer , nameof ( fieldSerializer ) ) ;
86+ _fieldSerializer = fieldSerializer ;
87+ _valueSerializer = Ensure . IsNotNull ( valueSerializer , nameof ( valueSerializer ) ) ;
88+ _underlyingSerializer = underlyingSerializer ;
8389 }
8490
8591 /// <summary>
@@ -97,6 +103,22 @@ public IBsonSerializer<TField> FieldSerializer
97103 {
98104 get { return _fieldSerializer ; }
99105 }
106+
107+ /// <summary>
108+ /// Gets the underlying serializer.
109+ /// </summary>
110+ public IBsonSerializer UnderlyingSerializer
111+ {
112+ get { return _underlyingSerializer ; }
113+ }
114+
115+ /// <summary>
116+ /// Gets the value serializer.
117+ /// </summary>
118+ public IBsonSerializer < TField > ValueSerializer
119+ {
120+ get { return _valueSerializer ; }
121+ }
100122 }
101123
102124 /// <summary>
@@ -273,9 +295,15 @@ public override RenderedFieldDefinition<TField> Render(IBsonSerializer<TDocument
273295 throw new InvalidOperationException ( message ) ;
274296 }
275297
276- var fieldSerializer = ( IBsonSerializer < TField > ) FieldValueSerializerHelper . GetSerializerForValueType ( field . Serializer , typeof ( TField ) ) ;
298+ var underlyingSerializer = field . Serializer ;
299+ var fieldSerializer = underlyingSerializer as IBsonSerializer < TField > ;
300+ var valueSerializer = ( IBsonSerializer < TField > ) FieldValueSerializerHelper . GetSerializerForValueType ( underlyingSerializer , typeof ( TField ) ) ;
301+ if ( valueSerializer == null )
302+ {
303+ valueSerializer = serializerRegistry . GetSerializer < TField > ( ) ;
304+ }
277305
278- return new RenderedFieldDefinition < TField > ( field . FieldName , fieldSerializer ) ;
306+ return new RenderedFieldDefinition < TField > ( field . FieldName , fieldSerializer , valueSerializer , underlyingSerializer ) ;
279307 }
280308 }
281309
@@ -332,20 +360,22 @@ public StringFieldDefinition(string fieldName, IBsonSerializer<TField> fieldSeri
332360 public override RenderedFieldDefinition < TField > Render ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry )
333361 {
334362 string resolvedName ;
335- IBsonSerializer resolvedSerializer ;
336- StringFieldDefinitionHelper . Resolve < TDocument > ( _fieldName , documentSerializer , out resolvedName , out resolvedSerializer ) ;
363+ IBsonSerializer underlyingSerializer ;
364+ StringFieldDefinitionHelper . Resolve < TDocument > ( _fieldName , documentSerializer , out resolvedName , out underlyingSerializer ) ;
365+
366+ var fieldSerializer = underlyingSerializer as IBsonSerializer < TField > ;
337367
338- var fieldSerializer = _fieldSerializer ;
339- if ( fieldSerializer == null && resolvedSerializer != null )
368+ var valueSerializer = _fieldSerializer ;
369+ if ( valueSerializer == null && underlyingSerializer != null )
340370 {
341- fieldSerializer = ( IBsonSerializer < TField > ) FieldValueSerializerHelper . GetSerializerForValueType ( resolvedSerializer , typeof ( TField ) ) ;
371+ valueSerializer = ( IBsonSerializer < TField > ) FieldValueSerializerHelper . GetSerializerForValueType ( underlyingSerializer , typeof ( TField ) ) ;
342372 }
343- if ( fieldSerializer == null )
373+ if ( valueSerializer == null )
344374 {
345- fieldSerializer = serializerRegistry . GetSerializer < TField > ( ) ;
375+ valueSerializer = serializerRegistry . GetSerializer < TField > ( ) ;
346376 }
347377
348- return new RenderedFieldDefinition < TField > ( resolvedName , fieldSerializer ) ;
378+ return new RenderedFieldDefinition < TField > ( resolvedName , fieldSerializer , valueSerializer , underlyingSerializer ) ;
349379 }
350380 }
351381
@@ -355,6 +385,7 @@ public static void Resolve<TDocument>(string fieldName, IBsonSerializer<TDocumen
355385 {
356386 resolvedFieldName = fieldName ;
357387 resolvedFieldSerializer = null ;
388+
358389 var documentSerializer = serializer as IBsonDocumentSerializer ;
359390 if ( documentSerializer == null )
360391 {
@@ -444,8 +475,7 @@ public UntypedFieldDefinitionAdapter(FieldDefinition<TDocument, TField> adaptee)
444475 public override RenderedFieldDefinition Render ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry )
445476 {
446477 var rendered = _adaptee . Render ( documentSerializer , serializerRegistry ) ;
447- return new RenderedFieldDefinition ( rendered . FieldName , rendered . FieldSerializer ) ;
478+ return new RenderedFieldDefinition ( rendered . FieldName , rendered . UnderlyingSerializer ) ;
448479 }
449480 }
450-
451481}
0 commit comments