public Type GetActualType(IBsonReader bsonReader, Type nominalType)
        {
            var bookmark = bsonReader.GetBookmark();

            bsonReader.ReadStartDocument();
            var t = nominalType;

            if (bsonReader.FindElement(ElementName))
            {
                var raw           = bsonReader.ReadString();
                var discriminator = _discriminatorMapper.Discriminator(raw);
                t = _discriminatorMapper.ConcreteType(discriminator);
            }
            bsonReader.ReturnToBookmark(bookmark);
            return(t);
        }
        public override object ReadJson(
            JsonReader reader,
            Type objectType,
            object existingValue,
            JsonSerializer serializer)
        {
            var jObject       = JObject.Load(reader);
            var name          = _propertyNameTransformer(_discriminatorMapper.DiscriminatorName);
            var raw           = jObject[name].ToString();
            var discriminator = _discriminatorMapper.Discriminator(raw);
            var instance      = _discriminatorMapper.GetNewInstance(discriminator);

            serializer.Populate(jObject.CreateReader(), instance);
            return(instance);
        }
 protected void AssertReturnsDiscriminator <T>(TDiscriminator expected)
 {
     Assert.AreEqual(expected, Mapper.Discriminator(typeof(T)));
 }