/// <summary> /// Validate that the expected and actual type names and type kinds are compatible. /// </summary> /// <param name="collectionItemTypeName">The actual type name.</param> /// <param name="collectionItemTypeKind">The actual type kind.</param> private void ValidateCollectionItemTypeNameAndKind(string collectionItemTypeName, EdmTypeKind collectionItemTypeKind) { // Compare the item type kinds. if (this.itemTypeKind != collectionItemTypeKind) { throw new ODataException(Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind(collectionItemTypeKind, this.itemTypeKind)); } if (this.itemTypeKind == EdmTypeKind.Primitive) { Debug.Assert(this.primitiveItemType != null, "this.primitiveItemType != null"); Debug.Assert(collectionItemTypeName != null, "collectionItemTypeName != null"); // NOTE: we do support type inheritance for spatial primitive types; otherwise the type names have to match. if (!string.IsNullOrEmpty(this.itemTypeName) && this.itemTypeName.Equals(collectionItemTypeName, System.StringComparison.OrdinalIgnoreCase)) { return; } if (this.primitiveItemType.IsSpatial()) { EdmPrimitiveTypeKind collectionItemPrimitiveKind = EdmCoreModel.Instance.GetPrimitiveTypeKind(collectionItemTypeName); IEdmPrimitiveType collectionItemPrimitiveType = EdmCoreModel.Instance.GetPrimitiveType(collectionItemPrimitiveKind); if (this.itemTypeDerivedFromCollectionValue) { // If the collection defines an item type, the collection item type has to be assignable to it. if (this.primitiveItemType.IsAssignableFrom(collectionItemPrimitiveType)) { return; } } else { // If the collection does not define an item type, the collection items must have a common base type. IEdmPrimitiveType commonBaseType = EdmLibraryExtensions.GetCommonBaseType(this.primitiveItemType, collectionItemPrimitiveType); if (commonBaseType != null) { this.primitiveItemType = commonBaseType; this.itemTypeName = commonBaseType.ODataFullName(); return; } } } throw new ODataException(Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName(collectionItemTypeName, this.itemTypeName)); } else { // Since we do not support type inheritance for complex types, comparison of the type names is sufficient if (string.CompareOrdinal(this.itemTypeName, collectionItemTypeName) != 0) { throw new ODataException(Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName(collectionItemTypeName, this.itemTypeName)); } } }
private void ValidateCollectionItemTypeNameAndKind(string collectionItemTypeName, EdmTypeKind collectionItemTypeKind) { if (this.itemTypeKind != collectionItemTypeKind) { throw new ODataException(Microsoft.Data.OData.Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind(collectionItemTypeKind, this.itemTypeKind)); } if (this.itemTypeKind == EdmTypeKind.Primitive) { if (string.CompareOrdinal(this.itemTypeName, collectionItemTypeName) == 0) { return; } if (this.primitiveItemType.IsSpatial()) { EdmPrimitiveTypeKind primitiveTypeKind = EdmCoreModel.Instance.GetPrimitiveTypeKind(collectionItemTypeName); IEdmPrimitiveType primitiveType = EdmCoreModel.Instance.GetPrimitiveType(primitiveTypeKind); if (this.itemTypeDerivedFromCollectionValue) { if (this.primitiveItemType.IsAssignableFrom(primitiveType)) { return; } } else { IEdmPrimitiveType commonBaseType = this.primitiveItemType.GetCommonBaseType(primitiveType); if (commonBaseType != null) { this.primitiveItemType = commonBaseType; this.itemTypeName = commonBaseType.ODataFullName(); return; } } } throw new ODataException(Microsoft.Data.OData.Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName(collectionItemTypeName, this.itemTypeName)); } if (string.CompareOrdinal(this.itemTypeName, collectionItemTypeName) != 0) { throw new ODataException(Microsoft.Data.OData.Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName(collectionItemTypeName, this.itemTypeName)); } }