14
14
*/
15
15
16
16
using System ;
17
+ using System . Collections . Generic ;
18
+ using System . Linq ;
17
19
using MongoDB . Bson . IO ;
18
20
19
21
namespace MongoDB . Bson . Serialization . Serializers
20
22
{
23
+ /// <summary>
24
+ /// A factory class for ValueTupleSerializers.
25
+ /// </summary>
26
+ public static class ValueTupleSerializer
27
+ {
28
+ /// <summary>
29
+ /// Creates a ValueTupleSerializer.
30
+ /// </summary>
31
+ /// <param name="itemSerializers">The item serializers.</param>
32
+ /// <returns>A ValueTupleSerializer.</returns>
33
+ public static IBsonSerializer Create ( IEnumerable < IBsonSerializer > itemSerializers )
34
+ {
35
+ var itemSerializersArray = itemSerializers . ToArray ( ) ;
36
+ var valueTupleSerializerType = CreateValueTupleSerializerType ( itemSerializersArray ) ;
37
+ return ( IBsonSerializer ) Activator . CreateInstance ( valueTupleSerializerType , itemSerializersArray ) ;
38
+
39
+ static Type CreateValueTupleSerializerType ( IBsonSerializer [ ] itemSerializersArray )
40
+ {
41
+ var itemTypes = itemSerializersArray . Select ( s => s . ValueType ) . ToArray ( ) ;
42
+ var valueTupleSerializerTypeDefinition = CreateValueTupleSerializerTypeDefinition ( itemTypes . Length ) ;
43
+ return valueTupleSerializerTypeDefinition . MakeGenericType ( itemTypes ) ;
44
+ }
45
+
46
+ static Type CreateValueTupleSerializerTypeDefinition ( int itemCount )
47
+ {
48
+ return itemCount switch
49
+ {
50
+ 1 => typeof ( ValueTupleSerializer < > ) ,
51
+ 2 => typeof ( ValueTupleSerializer < , > ) ,
52
+ 3 => typeof ( ValueTupleSerializer < , , > ) ,
53
+ 4 => typeof ( ValueTupleSerializer < , , , > ) ,
54
+ 5 => typeof ( ValueTupleSerializer < , , , , > ) ,
55
+ 6 => typeof ( ValueTupleSerializer < , , , , , > ) ,
56
+ 7 => typeof ( ValueTupleSerializer < , , , , , , > ) ,
57
+ 8 => typeof ( ValueTupleSerializer < , , , , , , , > ) ,
58
+ _ => throw new Exception ( $ "Invalid number of ValueTuple items : { itemCount } .")
59
+ } ;
60
+ }
61
+ }
62
+ }
63
+
21
64
/// <summary>
22
65
/// Represents a serializer for a <see cref="ValueTuple{T1}"/>.
23
66
/// </summary>
24
67
/// <typeparam name="T1">The type of item 1.</typeparam>
25
- public sealed class ValueTupleSerializer < T1 > : StructSerializerBase < ValueTuple < T1 > >
68
+ public sealed class ValueTupleSerializer < T1 > : StructSerializerBase < ValueTuple < T1 > > , IBsonTupleSerializer
26
69
{
27
70
// private fields
28
71
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -43,7 +86,7 @@ public ValueTupleSerializer()
43
86
public ValueTupleSerializer (
44
87
IBsonSerializer < T1 > item1Serializer )
45
88
{
46
- if ( item1Serializer == null ) { throw new ArgumentNullException ( ( nameof ( item1Serializer ) ) ) ; }
89
+ if ( item1Serializer == null ) { throw new ArgumentNullException ( nameof ( item1Serializer ) ) ; }
47
90
48
91
_lazyItem1Serializer = new Lazy < IBsonSerializer < T1 > > ( ( ) => item1Serializer ) ;
49
92
}
@@ -101,6 +144,16 @@ public override ValueTuple<T1> Deserialize(BsonDeserializationContext context, B
101
144
return new ValueTuple < T1 > ( item1 ) ;
102
145
}
103
146
147
+ /// <inheritdoc/>
148
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
149
+ {
150
+ return itemNumber switch
151
+ {
152
+ 1 => _lazyItem1Serializer . Value ,
153
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
154
+ } ;
155
+ }
156
+
104
157
/// <inheritdoc/>
105
158
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 > value )
106
159
{
@@ -115,7 +168,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
115
168
/// </summary>
116
169
/// <typeparam name="T1">The type of item 1.</typeparam>
117
170
/// <typeparam name="T2">The type of item 2.</typeparam>
118
- public sealed class ValueTupleSerializer < T1 , T2 > : StructSerializerBase < ValueTuple < T1 , T2 > >
171
+ public sealed class ValueTupleSerializer < T1 , T2 > : StructSerializerBase < ValueTuple < T1 , T2 > > , IBsonTupleSerializer
119
172
{
120
173
// private fields
121
174
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -139,7 +192,7 @@ public ValueTupleSerializer(
139
192
IBsonSerializer < T1 > item1Serializer ,
140
193
IBsonSerializer < T2 > item2Serializer )
141
194
{
142
- if ( item1Serializer == null ) { throw new ArgumentNullException ( ( nameof ( item1Serializer ) ) ) ; }
195
+ if ( item1Serializer == null ) { throw new ArgumentNullException ( nameof ( item1Serializer ) ) ; }
143
196
if ( item2Serializer == null ) { throw new ArgumentNullException ( nameof ( item2Serializer ) ) ; }
144
197
145
198
_lazyItem1Serializer = new Lazy < IBsonSerializer < T1 > > ( ( ) => item1Serializer ) ;
@@ -208,6 +261,17 @@ public override ValueTuple<T1, T2> Deserialize(BsonDeserializationContext contex
208
261
return new ValueTuple < T1 , T2 > ( item1 , item2 ) ;
209
262
}
210
263
264
+ /// <inheritdoc/>
265
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
266
+ {
267
+ return itemNumber switch
268
+ {
269
+ 1 => _lazyItem1Serializer . Value ,
270
+ 2 => _lazyItem2Serializer . Value ,
271
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
272
+ } ;
273
+ }
274
+
211
275
/// <inheritdoc/>
212
276
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 > value )
213
277
{
@@ -224,7 +288,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
224
288
/// <typeparam name="T1">The type of item 1.</typeparam>
225
289
/// <typeparam name="T2">The type of item 2.</typeparam>
226
290
/// <typeparam name="T3">The type of item 3.</typeparam>
227
- public sealed class ValueTupleSerializer < T1 , T2 , T3 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 > >
291
+ public sealed class ValueTupleSerializer < T1 , T2 , T3 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 > > , IBsonTupleSerializer
228
292
{
229
293
// private fields
230
294
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -251,7 +315,7 @@ public ValueTupleSerializer(
251
315
IBsonSerializer < T2 > item2Serializer ,
252
316
IBsonSerializer < T3 > item3Serializer )
253
317
{
254
- if ( item1Serializer == null ) { throw new ArgumentNullException ( ( nameof ( item1Serializer ) ) ) ; }
318
+ if ( item1Serializer == null ) { throw new ArgumentNullException ( nameof ( item1Serializer ) ) ; }
255
319
if ( item2Serializer == null ) { throw new ArgumentNullException ( nameof ( item2Serializer ) ) ; }
256
320
if ( item3Serializer == null ) { throw new ArgumentNullException ( nameof ( item3Serializer ) ) ; }
257
321
@@ -331,6 +395,18 @@ public override ValueTuple<T1, T2, T3> Deserialize(BsonDeserializationContext co
331
395
return new ValueTuple < T1 , T2 , T3 > ( item1 , item2 , item3 ) ;
332
396
}
333
397
398
+ /// <inheritdoc/>
399
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
400
+ {
401
+ return itemNumber switch
402
+ {
403
+ 1 => _lazyItem1Serializer . Value ,
404
+ 2 => _lazyItem2Serializer . Value ,
405
+ 3 => _lazyItem3Serializer . Value ,
406
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
407
+ } ;
408
+ }
409
+
334
410
/// <inheritdoc/>
335
411
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 , T3 > value )
336
412
{
@@ -349,7 +425,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
349
425
/// <typeparam name="T2">The type of item 2.</typeparam>
350
426
/// <typeparam name="T3">The type of item 3.</typeparam>
351
427
/// <typeparam name="T4">The type of item 4.</typeparam>
352
- public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 > >
428
+ public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 > > , IBsonTupleSerializer
353
429
{
354
430
// private fields
355
431
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -470,6 +546,19 @@ public override ValueTuple<T1, T2, T3, T4> Deserialize(BsonDeserializationContex
470
546
return new ValueTuple < T1 , T2 , T3 , T4 > ( item1 , item2 , item3 , item4 ) ;
471
547
}
472
548
549
+ /// <inheritdoc/>
550
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
551
+ {
552
+ return itemNumber switch
553
+ {
554
+ 1 => _lazyItem1Serializer . Value ,
555
+ 2 => _lazyItem2Serializer . Value ,
556
+ 3 => _lazyItem3Serializer . Value ,
557
+ 4 => _lazyItem4Serializer . Value ,
558
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
559
+ } ;
560
+ }
561
+
473
562
/// <inheritdoc/>
474
563
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 , T3 , T4 > value )
475
564
{
@@ -490,7 +579,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
490
579
/// <typeparam name="T3">The type of item 3.</typeparam>
491
580
/// <typeparam name="T4">The type of item 4.</typeparam>
492
581
/// <typeparam name="T5">The type of item 5.</typeparam>
493
- public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 > >
582
+ public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 > > , IBsonTupleSerializer
494
583
{
495
584
// private fields
496
585
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -625,6 +714,20 @@ public override ValueTuple<T1, T2, T3, T4, T5> Deserialize(BsonDeserializationCo
625
714
return new ValueTuple < T1 , T2 , T3 , T4 , T5 > ( item1 , item2 , item3 , item4 , item5 ) ;
626
715
}
627
716
717
+ /// <inheritdoc/>
718
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
719
+ {
720
+ return itemNumber switch
721
+ {
722
+ 1 => _lazyItem1Serializer . Value ,
723
+ 2 => _lazyItem2Serializer . Value ,
724
+ 3 => _lazyItem3Serializer . Value ,
725
+ 4 => _lazyItem4Serializer . Value ,
726
+ 5 => _lazyItem5Serializer . Value ,
727
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
728
+ } ;
729
+ }
730
+
628
731
/// <inheritdoc/>
629
732
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 , T3 , T4 , T5 > value )
630
733
{
@@ -647,7 +750,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
647
750
/// <typeparam name="T4">The type of item 4.</typeparam>
648
751
/// <typeparam name="T5">The type of item 5.</typeparam>
649
752
/// <typeparam name="T6">The type of item 6.</typeparam>
650
- public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 , T6 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 > >
753
+ public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 , T6 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 > > , IBsonTupleSerializer
651
754
{
652
755
// private fields
653
756
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -796,6 +899,21 @@ public override ValueTuple<T1, T2, T3, T4, T5, T6> Deserialize(BsonDeserializati
796
899
return new ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 > ( item1 , item2 , item3 , item4 , item5 , item6 ) ;
797
900
}
798
901
902
+ /// <inheritdoc/>
903
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
904
+ {
905
+ return itemNumber switch
906
+ {
907
+ 1 => _lazyItem1Serializer . Value ,
908
+ 2 => _lazyItem2Serializer . Value ,
909
+ 3 => _lazyItem3Serializer . Value ,
910
+ 4 => _lazyItem4Serializer . Value ,
911
+ 5 => _lazyItem5Serializer . Value ,
912
+ 6 => _lazyItem6Serializer . Value ,
913
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
914
+ } ;
915
+ }
916
+
799
917
/// <inheritdoc/>
800
918
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 > value )
801
919
{
@@ -820,7 +938,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
820
938
/// <typeparam name="T5">The type of item 5.</typeparam>
821
939
/// <typeparam name="T6">The type of item 6.</typeparam>
822
940
/// <typeparam name="T7">The type of item 7.</typeparam>
823
- public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 , T6 , T7 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 > >
941
+ public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 , T6 , T7 > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 > > , IBsonTupleSerializer
824
942
{
825
943
// private fields
826
944
private readonly Lazy < IBsonSerializer < T1 > > _lazyItem1Serializer ;
@@ -983,6 +1101,22 @@ public override ValueTuple<T1, T2, T3, T4, T5, T6, T7> Deserialize(BsonDeseriali
983
1101
return new ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 > ( item1 , item2 , item3 , item4 , item5 , item6 , item7 ) ;
984
1102
}
985
1103
1104
+ /// <inheritdoc/>
1105
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
1106
+ {
1107
+ return itemNumber switch
1108
+ {
1109
+ 1 => _lazyItem1Serializer . Value ,
1110
+ 2 => _lazyItem2Serializer . Value ,
1111
+ 3 => _lazyItem3Serializer . Value ,
1112
+ 4 => _lazyItem4Serializer . Value ,
1113
+ 5 => _lazyItem5Serializer . Value ,
1114
+ 6 => _lazyItem6Serializer . Value ,
1115
+ 7 => _lazyItem7Serializer . Value ,
1116
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
1117
+ } ;
1118
+ }
1119
+
986
1120
/// <inheritdoc/>
987
1121
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 > value )
988
1122
{
@@ -1009,7 +1143,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
1009
1143
/// <typeparam name="T6">The type of item 6.</typeparam>
1010
1144
/// <typeparam name="T7">The type of item 7.</typeparam>
1011
1145
/// <typeparam name="TRest">The type of the rest item.</typeparam>
1012
- public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 , T6 , T7 , TRest > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 , TRest > >
1146
+ public sealed class ValueTupleSerializer < T1 , T2 , T3 , T4 , T5 , T6 , T7 , TRest > : StructSerializerBase < ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 , TRest > > , IBsonTupleSerializer
1013
1147
where TRest : struct
1014
1148
{
1015
1149
// private fields
@@ -1187,6 +1321,23 @@ public override ValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest> Deserialize(BsonDe
1187
1321
return new ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 , TRest > ( item1 , item2 , item3 , item4 , item5 , item6 , item7 , rest ) ;
1188
1322
}
1189
1323
1324
+ /// <inheritdoc/>
1325
+ public IBsonSerializer GetItemSerializer ( int itemNumber )
1326
+ {
1327
+ return itemNumber switch
1328
+ {
1329
+ 1 => _lazyItem1Serializer . Value ,
1330
+ 2 => _lazyItem2Serializer . Value ,
1331
+ 3 => _lazyItem3Serializer . Value ,
1332
+ 4 => _lazyItem4Serializer . Value ,
1333
+ 5 => _lazyItem5Serializer . Value ,
1334
+ 6 => _lazyItem6Serializer . Value ,
1335
+ 7 => _lazyItem7Serializer . Value ,
1336
+ 8 => _lazyRestSerializer . Value ,
1337
+ _ => throw new IndexOutOfRangeException ( nameof ( itemNumber ) )
1338
+ } ;
1339
+ }
1340
+
1190
1341
/// <inheritdoc/>
1191
1342
public override void Serialize ( BsonSerializationContext context , BsonSerializationArgs args , ValueTuple < T1 , T2 , T3 , T4 , T5 , T6 , T7 , TRest > value )
1192
1343
{
0 commit comments