@@ -415,6 +415,112 @@ public static void RegisterClassMap(BsonClassMap classMap)
415
415
}
416
416
}
417
417
418
+ /// <summary>
419
+ /// Registers a class map if it is not already registered.
420
+ /// </summary>
421
+ /// <typeparam name="TClass">The class.</typeparam>
422
+ /// <returns>True if this call registered the class map, false if the class map was already registered.</returns>
423
+ public static bool TryRegisterClassMap < TClass > ( )
424
+ {
425
+ return TryRegisterClassMap ( ClassMapFactory ) ;
426
+
427
+ static BsonClassMap < TClass > ClassMapFactory ( )
428
+ {
429
+ var classMap = new BsonClassMap < TClass > ( ) ;
430
+ classMap . AutoMap ( ) ;
431
+ return classMap ;
432
+ }
433
+ }
434
+
435
+ /// <summary>
436
+ /// Registers a class map if it is not already registered.
437
+ /// </summary>
438
+ /// <typeparam name="TClass">The class.</typeparam>
439
+ /// <param name="classMap">The class map.</param>
440
+ /// <returns>True if this call registered the class map, false if the class map was already registered.</returns>
441
+ public static bool TryRegisterClassMap < TClass > ( BsonClassMap < TClass > classMap )
442
+ {
443
+ if ( classMap == null )
444
+ {
445
+ throw new ArgumentNullException ( nameof ( classMap ) ) ;
446
+ }
447
+
448
+ return TryRegisterClassMap ( ClassMapFactory ) ;
449
+
450
+ BsonClassMap < TClass > ClassMapFactory ( )
451
+ {
452
+ return classMap ;
453
+ }
454
+ }
455
+
456
+ /// <summary>
457
+ /// Registers a class map if it is not already registered.
458
+ /// </summary>
459
+ /// <typeparam name="TClass">The class.</typeparam>
460
+ /// <param name="classMapInitializer">The class map initializer (only called if the class map is not already registered).</param>
461
+ /// <returns>True if this call registered the class map, false if the class map was already registered.</returns>
462
+ public static bool TryRegisterClassMap < TClass > ( Action < BsonClassMap < TClass > > classMapInitializer )
463
+ {
464
+ if ( classMapInitializer == null )
465
+ {
466
+ throw new ArgumentNullException ( nameof ( classMapInitializer ) ) ;
467
+ }
468
+
469
+ return TryRegisterClassMap ( ClassMapFactory ) ;
470
+
471
+ BsonClassMap < TClass > ClassMapFactory ( )
472
+ {
473
+ return new BsonClassMap < TClass > ( classMapInitializer ) ;
474
+ }
475
+ }
476
+
477
+ /// <summary>
478
+ /// Registers a class map if it is not already registered.
479
+ /// </summary>
480
+ /// <typeparam name="TClass">The class.</typeparam>
481
+ /// <param name="classMapFactory">The class map factory (only called if the class map is not already registered).</param>
482
+ /// <returns>True if this call registered the class map, false if the class map was already registered.</returns>
483
+ public static bool TryRegisterClassMap < TClass > ( Func < BsonClassMap < TClass > > classMapFactory )
484
+ {
485
+ if ( classMapFactory == null )
486
+ {
487
+ throw new ArgumentNullException ( nameof ( classMapFactory ) ) ;
488
+ }
489
+
490
+ BsonSerializer . ConfigLock . EnterReadLock ( ) ;
491
+ try
492
+ {
493
+ if ( __classMaps . ContainsKey ( typeof ( TClass ) ) )
494
+ {
495
+ return false ;
496
+ }
497
+ }
498
+ finally
499
+ {
500
+ BsonSerializer . ConfigLock . ExitReadLock ( ) ;
501
+ }
502
+
503
+ BsonSerializer . ConfigLock . EnterWriteLock ( ) ;
504
+ try
505
+ {
506
+ if ( __classMaps . ContainsKey ( typeof ( TClass ) ) )
507
+ {
508
+ return false ;
509
+ }
510
+ else
511
+ {
512
+ // create a classMap for TClass and register it
513
+ var classMap = classMapFactory ( ) ;
514
+ RegisterClassMap ( classMap ) ;
515
+ return true ;
516
+ }
517
+ }
518
+ finally
519
+ {
520
+ BsonSerializer . ConfigLock . ExitWriteLock ( ) ;
521
+ }
522
+ }
523
+
418
524
// public methods
419
525
/// <summary>
420
526
/// Automaps the class.
0 commit comments