"System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance." when using EnumRepresentationConvention or ObjectSerializerAllowedTypesConvention

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Unresolved
    • Priority: Major - P3
    • None
    • Affects Version/s: 3.6.0
    • Component/s: BSON
    • None
    • Dotnet Drivers
    • None
    • None
    • None
    • None
    • None
    • None

      Summary

      When using either `EnumRepresentationConvention` or `ObjectSerializerAllowedTypesConvention`, if the type is recursive with a collection of the same type, initialization will fail with the following exception: "System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance."

      Please provide the version of the driver. If applicable, please provide the MongoDB server version and topology (standalone, replica set, or sharded cluster).

      Applies to current codebase as of 2026-02-28 (tested by running unit tests) and C# driver version 3.6.0.

      How to Reproduce

      In `MongoDB.Bson.Tests.Serialization.Conventions.EnumRepresentationConventionTests`, adjust class `C` definition and add the following test case:

       

      
      

      _public class C
      {
      public E E

      { get; set; }
      public E? NE { get; set; }
      public E[] ArrayEnum { get; set; }
      public E[][] ArrayOfArrayEnum { get; set; }
      public Dictionary<string, E> DictionaryEnum { get; set; }
      public Dictionary<string, E[]> NestedDictionaryEnum { get; set; }
      public Dictionary<E, string> DictionaryKeyEnum { get; set; }
      public int I { get; set; }
      public int NI { get; set; }
      public int[] ArrayInt { get; set; }
      public C RecursiveProp { get; set; }
      public C[] RecursivePropArray { get; set; }
      }_

      _[Fact]
      public void Convention_should_work_with_recursive_type_when_top_level_is_false()
      {
      var pack = new ConventionPack { new EnumRepresentationConvention(BsonType.String, topLevelOnly: false) };
      ConventionRegistry.Register("enumRecursive", pack, t => t == typeof(C));

      _ = new BsonClassMap<C>(cm => cm.AutoMap()).Freeze();

      ConventionRegistry.Remove("enumRecursive");
      }_

      Also reproducible in `MongoDB.Bson.Tests.Serialization.Conventions.ObjectSerializerAllowedTypesConventionTests` by adjusting the `TestClass` definition:

       
      
      

      _private class TestClass
      {
      public object ObjectProp { get; set; }

      public object[] ArrayOfObjectProp { get; set; }
      public object[][] ArrayOfArrayOfObjectProp { get; set; }
      public TestClass RecursiveProp { get; set; }
      public TestClass[] RecursivePropArray { get; set; }
      }_

      Tests `Convention_should_work_with_recursive_type` and `Convention_should_be_applied_during_automapping` now fail.

       

       

      Additional Background

      Full stack trace of the failed unit test in `EnumRepresentationConventionTests`:

      System.InvalidOperationException: ValueFactory attempted to access the Value property of this instance.System.InvalidOperationException
      ValueFactory attempted to access the Value property of this instance.
         at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
         at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
         at System.Lazy`1.CreateValue()
         at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.get_ItemSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\EnumerableSerializerBase.cs:line 278
         at MongoDB.Bson.Serialization.Serializers.ArraySerializer`1.MongoDB.Bson.Serialization.IChildSerializerConfigurable.get_ChildSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\ArraySerializer.cs:line 128
         at MongoDB.Bson.Serialization.SerializerConfigurator.ReconfigureSerializerRecursively(IBsonSerializer serializer, Func`2 reconfigure) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\SerializerConfigurator.cs:line 49
         at MongoDB.Bson.Serialization.Conventions.EnumRepresentationConvention.Apply(BsonMemberMap memberMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\EnumRepresentationConvention.cs:line 79
         at MongoDB.Bson.Serialization.Conventions.ConventionRunner.Apply(BsonClassMap classMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\ConventionRunner.cs:line 61
         at MongoDB.Bson.Serialization.BsonClassMap.AutoMapClass() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 1390
         at MongoDB.Bson.Serialization.BsonClassMap.AutoMap() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 533
         at MongoDB.Bson.Serialization.BsonClassMap.LookupClassMap(Type classType) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 354
         at MongoDB.Bson.Serialization.BsonClassMapSerializationProvider.GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMapSerializationProvider.cs:line 44
         at MongoDB.Bson.Serialization.BsonSerializerRegistry.CreateSerializer(Type type) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonSerializerRegistry.cs:line 164
         at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
         at MongoDB.Bson.Serialization.BsonSerializerRegistry.GetSerializer(Type type) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonSerializerRegistry.cs:line 65
         at MongoDB.Bson.Serialization.BsonSerializerRegistry.GetSerializer[T]() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonSerializerRegistry.cs:line 78
         at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.<>c__DisplayClass4_0.<.ctor>b__0() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\EnumerableSerializerBase.cs:line 266
         at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
         at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
         at System.Lazy`1.CreateValue()
         at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.get_ItemSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\EnumerableSerializerBase.cs:line 278
         at MongoDB.Bson.Serialization.Serializers.ArraySerializer`1.MongoDB.Bson.Serialization.IChildSerializerConfigurable.get_ChildSerializer() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Serializers\ArraySerializer.cs:line 128
         at MongoDB.Bson.Serialization.SerializerConfigurator.ReconfigureSerializerRecursively(IBsonSerializer serializer, Func`2 reconfigure) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\SerializerConfigurator.cs:line 49
         at MongoDB.Bson.Serialization.Conventions.EnumRepresentationConvention.Apply(BsonMemberMap memberMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\EnumRepresentationConvention.cs:line 79
         at MongoDB.Bson.Serialization.Conventions.ConventionRunner.Apply(BsonClassMap classMap) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\Conventions\ConventionRunner.cs:line 61
         at MongoDB.Bson.Serialization.BsonClassMap.AutoMapClass() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 1390
         at MongoDB.Bson.Serialization.BsonClassMap.AutoMap() in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 533
         at MongoDB.Bson.Tests.Serialization.Conventions.EnumRepresentationConventionTests.<>c.<Convention_should_work_with_recursive_type_when_top_level_is_false>b__15_1(BsonClassMap`1 cm) in C:\dev\mongo-csharp-driver\tests\MongoDB.Bson.Tests\Serialization\Conventions\EnumRepresentationConventionTests.cs:line 234
         at MongoDB.Bson.Serialization.BsonClassMap`1..ctor(Action`1 classMapInitializer) in C:\dev\mongo-csharp-driver\src\MongoDB.Bson\Serialization\BsonClassMap.cs:line 1508
         at MongoDB.Bson.Tests.Serialization.Conventions.EnumRepresentationConventionTests.Convention_should_work_with_recursive_type_when_top_level_is_false() in C:\dev\mongo-csharp-driver\tests\MongoDB.Bson.Tests\Serialization\Conventions\EnumRepresentationConventionTests.cs:line 234
         at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
         at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) 

            Assignee:
            Oleksandr Poliakov
            Reporter:
            Christian Merat
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: