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); }
private static object ConvertBsonArray(BsonArray bsonArray, ResourceType resourceType, string propertyName, MongoMetadata mongoMetadata) { if (bsonArray == null || bsonArray.Count == 0) { return(new object[0]); } bool isDocument = false; int nonNullItemCount = 0; for (int index = 0; index < bsonArray.Count; index++) { if (bsonArray[index] != BsonNull.Value) { if (bsonArray[index].GetType() == typeof(BsonDocument)) { isDocument = true; } ++nonNullItemCount; } } object[] propertyValue = isDocument ? new DSPResource[nonNullItemCount] : new object[nonNullItemCount]; int valueIndex = 0; for (int index = 0; index < bsonArray.Count; index++) { if (bsonArray[index] != BsonNull.Value) { if (isDocument) { propertyValue[valueIndex++] = CreateDSPResource(bsonArray[index].AsBsonDocument, mongoMetadata, propertyName, MongoMetadata.GetQualifiedTypePrefix(resourceType.Name)); } else { propertyValue[valueIndex++] = ConvertRawValue(bsonArray[index]); } } } return(propertyValue); }