From 0a181cbc1fb8528b700887bbbdb0b1781b94b695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lance=20Wynn=20=F0=9F=A6=84=F0=9F=92=BE?= Date: Wed, 22 Jan 2025 18:55:29 -0700 Subject: [PATCH] Added CollectionGenericType to ClientPropertyAnnotation Modified EntryValueMaterializationPolicy to ensure the correct collection element type is used if a POCO does not have a collection initializer for collection properties. --- .../Materialization/EntryValueMaterializationPolicy.cs | 6 +++--- .../Metadata/ClientPropertyAnnotation.cs | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OData.Client/Materialization/EntryValueMaterializationPolicy.cs b/src/Microsoft.OData.Client/Materialization/EntryValueMaterializationPolicy.cs index a2fa1dc0d1..1254f4fc9d 100644 --- a/src/Microsoft.OData.Client/Materialization/EntryValueMaterializationPolicy.cs +++ b/src/Microsoft.OData.Client/Materialization/EntryValueMaterializationPolicy.cs @@ -485,7 +485,7 @@ private object GetOrCreateCollectionProperty(object instance, ClientPropertyAnno else { // Try List<> first because that's what we did in V1/V2, but use the actual property type if it doesn't support List<> - Type listCollectionType = typeof(List<>).MakeGenericType(property.EntityCollectionItemType); + Type listCollectionType = typeof(List<>).MakeGenericType(property.CollectionGenericType); if (collectionType.IsAssignableFrom(listCollectionType)) { collectionType = listCollectionType; @@ -498,7 +498,7 @@ private object GetOrCreateCollectionProperty(object instance, ClientPropertyAnno { if (DSClient.PlatformHelper.IsInterface(collectionType)) { - collectionType = typeof(System.Collections.ObjectModel.Collection<>).MakeGenericType(property.EntityCollectionItemType); + collectionType = typeof(System.Collections.ObjectModel.Collection<>).MakeGenericType(property.CollectionGenericType); } result = this.CreateNewInstance(property.EdmProperty.Type, collectionType); @@ -767,7 +767,7 @@ private void MaterializeDynamicProperty(MaterializerEntry entry, ODataNestedReso containerProperty.Add(link.Name, collection); } } - else + else { MaterializerEntry linkEntry = linkState.Entry; Type itemType = ResolveClientTypeForDynamicProperty(linkEntry.Entry.TypeName, entry.ResolvedObject); diff --git a/src/Microsoft.OData.Client/Metadata/ClientPropertyAnnotation.cs b/src/Microsoft.OData.Client/Metadata/ClientPropertyAnnotation.cs index 72636669a9..e18448e2bf 100644 --- a/src/Microsoft.OData.Client/Metadata/ClientPropertyAnnotation.cs +++ b/src/Microsoft.OData.Client/Metadata/ClientPropertyAnnotation.cs @@ -261,6 +261,11 @@ internal bool IsResourceSet } } + internal Type CollectionGenericType + { + get { return this.collectionGenericType; } + } + /// Type of items in the primitive or complex collection. internal Type PrimitiveOrComplexCollectionItemType {