internal static bool CanConvertTo(SingleValueNode sourceNodeOrNull, IEdmTypeReference sourceReference, IEdmTypeReference targetReference) { Debug.Assert(sourceReference != null, "sourceReference != null"); Debug.Assert(targetReference != null, "targetReference != null"); //// Copy of the ResourceQueryParser.ExpressionParser.IsCompatibleWith method. if (sourceReference.IsEquivalentTo(targetReference)) { return true; } if (targetReference.IsODataComplexTypeKind() || targetReference.IsODataEntityTypeKind()) { // for structured types, use IsAssignableFrom return EdmLibraryExtensions.IsAssignableFrom( (IEdmStructuredType)targetReference.Definition, (IEdmStructuredType)sourceReference.Definition); } //// This rule stops the parser from considering nullable types as incompatible //// with non-nullable types. We have however implemented this rule because we just //// access underlying rules. C# requires an explicit .Value access, and EDM has no //// nullablity on types and (at the model level) implements null propagation. //// //// if (sourceReference.IsNullable && !targetReference.IsNullable) //// { //// return false; //// } if (sourceReference.IsEnum() && targetReference.IsEnum()) { if (sourceReference.Definition.IsEquivalentTo(targetReference.Definition)) { return targetReference.IsNullable() || (!sourceReference.IsNullable()); } return false; } IEdmPrimitiveTypeReference sourcePrimitiveTypeReference = sourceReference.AsPrimitiveOrNull(); IEdmPrimitiveTypeReference targetPrimitiveTypeReference = targetReference.AsPrimitiveOrNull(); if (sourcePrimitiveTypeReference == null || targetPrimitiveTypeReference == null) { return false; } return MetadataUtilsCommon.CanConvertPrimitiveTypeTo(sourceNodeOrNull, sourcePrimitiveTypeReference.PrimitiveDefinition(), targetPrimitiveTypeReference.PrimitiveDefinition()); }
internal static bool CanConvertTo(IEdmTypeReference sourceReference, IEdmTypeReference targetReference) { if (sourceReference.IsEquivalentTo(targetReference)) { return(true); } if (targetReference.IsODataComplexTypeKind() || targetReference.IsODataEntityTypeKind()) { return(((IEdmStructuredType)targetReference.Definition).IsAssignableFrom(((IEdmStructuredType)sourceReference.Definition))); } if (IsOpenPropertyType(targetReference)) { return(true); } IEdmPrimitiveTypeReference type = sourceReference.AsPrimitiveOrNull(); IEdmPrimitiveTypeReference reference2 = targetReference.AsPrimitiveOrNull(); return(((type != null) && (reference2 != null)) && MetadataUtilsCommon.CanConvertPrimitiveTypeTo(type.PrimitiveDefinition(), reference2.PrimitiveDefinition())); }
public void ValidateSpecificSpatialTypesAreConvertable() { Assert.Equal(true, MetadataUtilsCommon.CanConvertPrimitiveTypeTo(null, EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.GeographyCollection), EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Geography))); }
internal static IEdmTypeReference ResolveAndValidatePrimitiveTargetType(IEdmTypeReference expectedTypeReference, EdmTypeKind payloadTypeKind, IEdmType payloadType, string payloadTypeName, IEdmType defaultPayloadType, IEdmModel model, ODataMessageReaderSettings messageReaderSettings, ODataVersion version) { bool flag = (messageReaderSettings.ReaderBehavior.TypeResolver != null) && (payloadType != null); if ((expectedTypeReference != null) && !flag) { ValidateTypeSupported(expectedTypeReference, version); } if ((payloadTypeKind != EdmTypeKind.None) && (messageReaderSettings.DisablePrimitiveTypeConversion || !messageReaderSettings.DisableStrictMetadataValidation)) { ValidationUtils.ValidateTypeKind(payloadTypeKind, EdmTypeKind.Primitive, payloadTypeName); } if (!model.IsUserModel()) { return(GetNullablePayloadTypeReference(payloadType ?? defaultPayloadType)); } if (((expectedTypeReference == null) || flag) || messageReaderSettings.DisablePrimitiveTypeConversion) { return(GetNullablePayloadTypeReference(payloadType ?? defaultPayloadType)); } if (!messageReaderSettings.DisableStrictMetadataValidation && ((payloadType != null) && !MetadataUtilsCommon.CanConvertPrimitiveTypeTo((IEdmPrimitiveType)payloadType, (IEdmPrimitiveType)expectedTypeReference.Definition))) { throw new ODataException(Microsoft.Data.OData.Strings.ValidationUtils_IncompatibleType(payloadTypeName, expectedTypeReference.ODataFullName())); } return(expectedTypeReference); }