/// <summary> /// User hook to resolve name into a type. /// </summary> /// <param name="wireName">Name to resolve.</param> /// <param name="expectedType">Expected type for the name.</param> /// <returns>the type as returned by the resolver. If no resolver is registered or resolver returns null, expected type is returned.</returns> /// <exception cref="InvalidOperationException">if ResolveType function returns a type not assignable to the userType</exception> private Type ResolveTypeFromName(string wireName, Type expectedType) { Debug.Assert(!String.IsNullOrEmpty(wireName), "!String.IsNullOrEmpty(wireName)"); Debug.Assert(expectedType != null, "userType != null"); // If there is a mismatch between the wireName and expected type (For e.g. wireName is Edm.Int32 and expectedType is a complex type) // we will return Edm.Int32 from this method and ODatalib fails stating the type kind do not match. Type payloadType; if (!ClientConvert.ToNamedType(wireName, out payloadType)) { payloadType = this.resolveTypeFromName(wireName); if (payloadType == null) { // if the type resolution method returns null or the ResolveType property was not set #if !PORTABLELIB payloadType = ClientTypeCache.ResolveFromName(wireName, expectedType); #else payloadType = ClientTypeCache.ResolveFromName(wireName, expectedType, this.GetType()); #endif } if (!this.skipTypeAssignabilityCheck && (payloadType != null) && (!expectedType.IsAssignableFrom(payloadType))) { // throw an exception if the type from the resolver is not assignable to the expected type throw Error.InvalidOperation(Strings.Deserialize_Current(expectedType, payloadType)); } } return(payloadType ?? expectedType); }
private Type ResolveTypeFromName(string wireName, Type expectedType) { Type type; if (!ClientConvert.ToNamedType(wireName, out type)) { type = this.ResponseInfo.ResolveTypeFromName(wireName); if (type == null) { type = ClientTypeCache.ResolveFromName(wireName, expectedType); } if ((!this.projectionQuery && (type != null)) && !expectedType.IsAssignableFrom(type)) { throw System.Data.Services.Client.Error.InvalidOperation(System.Data.Services.Client.Strings.Deserialize_Current(expectedType, type)); } } return(type ?? expectedType); }