1
- /* Copyright 2010-2016 MongoDB Inc.
1
+ /* Copyright 2010-2017 MongoDB Inc.
2
2
*
3
3
* Licensed under the Apache License, Version 2.0 (the "License");
4
4
* you may not use this file except in compliance with the License.
@@ -70,16 +70,22 @@ public sealed class RenderedFieldDefinition<TField>
70
70
{
71
71
private readonly string _fieldName ;
72
72
private readonly IBsonSerializer < TField > _fieldSerializer ;
73
+ private readonly IBsonSerializer _underlyingSerializer ;
74
+ private readonly IBsonSerializer < TField > _valueSerializer ;
73
75
74
76
/// <summary>
75
77
/// Initializes a new instance of the <see cref="RenderedFieldDefinition{TField}" /> class.
76
78
/// </summary>
77
79
/// <param name="fieldName">The field name.</param>
78
80
/// <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 )
80
84
{
81
85
_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 ;
83
89
}
84
90
85
91
/// <summary>
@@ -97,6 +103,22 @@ public IBsonSerializer<TField> FieldSerializer
97
103
{
98
104
get { return _fieldSerializer ; }
99
105
}
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
+ }
100
122
}
101
123
102
124
/// <summary>
@@ -273,9 +295,15 @@ public override RenderedFieldDefinition<TField> Render(IBsonSerializer<TDocument
273
295
throw new InvalidOperationException ( message ) ;
274
296
}
275
297
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
+ }
277
305
278
- return new RenderedFieldDefinition < TField > ( field . FieldName , fieldSerializer ) ;
306
+ return new RenderedFieldDefinition < TField > ( field . FieldName , fieldSerializer , valueSerializer , underlyingSerializer ) ;
279
307
}
280
308
}
281
309
@@ -332,20 +360,22 @@ public StringFieldDefinition(string fieldName, IBsonSerializer<TField> fieldSeri
332
360
public override RenderedFieldDefinition < TField > Render ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry )
333
361
{
334
362
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 > ;
337
367
338
- var fieldSerializer = _fieldSerializer ;
339
- if ( fieldSerializer == null && resolvedSerializer != null )
368
+ var valueSerializer = _fieldSerializer ;
369
+ if ( valueSerializer == null && underlyingSerializer != null )
340
370
{
341
- fieldSerializer = ( IBsonSerializer < TField > ) FieldValueSerializerHelper . GetSerializerForValueType ( resolvedSerializer , typeof ( TField ) ) ;
371
+ valueSerializer = ( IBsonSerializer < TField > ) FieldValueSerializerHelper . GetSerializerForValueType ( underlyingSerializer , typeof ( TField ) ) ;
342
372
}
343
- if ( fieldSerializer == null )
373
+ if ( valueSerializer == null )
344
374
{
345
- fieldSerializer = serializerRegistry . GetSerializer < TField > ( ) ;
375
+ valueSerializer = serializerRegistry . GetSerializer < TField > ( ) ;
346
376
}
347
377
348
- return new RenderedFieldDefinition < TField > ( resolvedName , fieldSerializer ) ;
378
+ return new RenderedFieldDefinition < TField > ( resolvedName , fieldSerializer , valueSerializer , underlyingSerializer ) ;
349
379
}
350
380
}
351
381
@@ -355,6 +385,7 @@ public static void Resolve<TDocument>(string fieldName, IBsonSerializer<TDocumen
355
385
{
356
386
resolvedFieldName = fieldName ;
357
387
resolvedFieldSerializer = null ;
388
+
358
389
var documentSerializer = serializer as IBsonDocumentSerializer ;
359
390
if ( documentSerializer == null )
360
391
{
@@ -444,8 +475,7 @@ public UntypedFieldDefinitionAdapter(FieldDefinition<TDocument, TField> adaptee)
444
475
public override RenderedFieldDefinition Render ( IBsonSerializer < TDocument > documentSerializer , IBsonSerializerRegistry serializerRegistry )
445
476
{
446
477
var rendered = _adaptee . Render ( documentSerializer , serializerRegistry ) ;
447
- return new RenderedFieldDefinition ( rendered . FieldName , rendered . FieldSerializer ) ;
478
+ return new RenderedFieldDefinition ( rendered . FieldName , rendered . UnderlyingSerializer ) ;
448
479
}
449
480
}
450
-
451
481
}
0 commit comments