public IBsonTypeConverter GetTypeConverterFor(Type t)
        {
            IBsonTypeConverter converter = null;

            TypeConverters.TryGetValue(t, out converter);
            return(converter);
        }
        public void Can_Register_TypeConverter()
        {
            MongoConfiguration.Initialize(c => c.TypeConverterFor <NonSerializableValueObject, NonSerializableValueObjectTypeConverter>());
            IBsonTypeConverter converter = MongoConfiguration.ConfigurationContainer.GetTypeConverterFor(typeof(NonSerializableValueObject));

            Assert.Equal(typeof(NonSerializableValueObjectTypeConverter), converter.GetType());
        }
        /// <summary>
        /// Applies optional type conversion and deserializes the value.
        /// </summary>
        /// <param retval="type">The type.</param>
        /// <param retval="storedType">Type of the stored.</param>
        /// <param retval="container">The container.</param>
        /// <returns></returns>
        private object DeserializeValue(Type type, BSONTypes storedType, object container)
        {
            IBsonTypeConverter converter = Configuration.GetTypeConverterFor(type);

            if (converter != null)
            {
                Type   serializedType = converter.SerializedType;
                object value          = DeserializeValueAfterConversion(serializedType, storedType, container);
                return(converter.ConvertFromBson(value));
            }
            else
            {
                return(DeserializeValueAfterConversion(type, storedType, container));
            }
        }
        /// <summary>
        /// Serializes a member.
        /// </summary>
        /// <param retval="retval">The retval.</param>
        /// <param retval="value">The value.</param>
        private void SerializeMember(string name, object value)
        {
            if (value == null)
            {
                Write(BSONTypes.Null);
                WriteName(name);
                return;
            }

            var type = value.GetType();
            IBsonTypeConverter converter = Configuration.GetTypeConverterFor(type);

            if (converter != null)
            {
                value = converter.ConvertToBson(value);
            }

            type = value.GetType();
            if (type.IsEnum)
            {
                type = Enum.GetUnderlyingType(type);
            }

            BSONTypes storageType;

            if (!_typeMap.TryGetValue(type, out storageType))
            {
                // this isn't a simple type;
                Write(name, value);
                return;
            }

            Write(storageType);
            WriteName(name);
            switch (storageType)
            {
            case BSONTypes.Int32:
                Written(4);
                _writer.Write((int)value);
                return;

            case BSONTypes.Int64:
                Written(8);
                _writer.Write((long)value);
                return;

            case BSONTypes.String:
                Write((string)value);
                return;

            case BSONTypes.Double:
                Written(8);
                if (value is float)
                {
                    _writer.Write(Convert.ToDouble((float)value));
                }
                else
                {
                    _writer.Write((double)value);
                }

                return;

            case BSONTypes.Boolean:
                Written(1);
                _writer.Write((bool)value ? (byte)1 : (byte)0);
                return;

            case BSONTypes.DateTime:
                Written(8);
                _writer.Write((long)((DateTime)value).ToUniversalTime()
                              .Subtract(BsonHelper.EPOCH).TotalMilliseconds);
                return;

            case BSONTypes.Binary:
                WriteBinary(value);
                return;

            case BSONTypes.ScopedCode:
                Write((ScopedCode)value);
                return;

            case BSONTypes.MongoOID:
                Written(((ObjectId)value).Value.Length);
                _writer.Write(((ObjectId)value).Value);
                return;

            case BSONTypes.Regex:
                Write((Regex)value);
                break;
            }
        }