private static object ConvertBsonValue(BsonValue bsonValue, ResourceType resourceType, ResourceProperty resourceProperty, string propertyName, MongoMetadata mongoMetadata)
{
if (bsonValue == null)
{
return(null);
}
object propertyValue = null;
bool convertValue;
if (bsonValue.GetType() == typeof(BsonDocument))
{
var bsonDocument = bsonValue.AsBsonDocument;
if (IsCsharpNullDocument(bsonDocument))
{
convertValue = false;
}
else
{
propertyValue = CreateDSPResource(bsonDocument, mongoMetadata, propertyName,
MongoMetadata.GetQualifiedTypePrefix(resourceType.Name));
convertValue = true;
}
}
else if (bsonValue.GetType() == typeof(BsonArray))
{
var bsonArray = bsonValue.AsBsonArray;
if (bsonArray != null && bsonArray.Count > 0)
{
propertyValue = ConvertBsonArray(bsonArray, resourceType, propertyName, mongoMetadata);
}
convertValue = false;
}
else if (bsonValue.GetType() == typeof(BsonNull) && resourceProperty.Kind == ResourcePropertyKind.Collection)
{
propertyValue = ConvertBsonArray(new BsonArray(0), resourceType, propertyName, mongoMetadata);
convertValue = false;
}
else
{
propertyValue = ConvertRawValue(bsonValue);
convertValue = true;
}
if (propertyValue != null && convertValue)
{
var propertyType = resourceProperty.ResourceType.InstanceType;
Type underlyingNonNullableType = Nullable.GetUnderlyingType(resourceProperty.ResourceType.InstanceType);
if (underlyingNonNullableType != null)
{
propertyType = underlyingNonNullableType;
}
propertyValue = Convert.ChangeType(propertyValue, propertyType);
}
return(propertyValue);
}