예제 #1
0
        private static IEdmValue AssertType(IEdmTypeReference targetType, IEdmValue operand)
        {
            IEdmTypeReference type      = operand.Type;
            EdmValueKind      valueKind = operand.ValueKind;

            if ((type == null || valueKind == EdmValueKind.Null || !type.Definition.IsOrInheritsFrom(targetType.Definition)) && targetType.TypeKind() != EdmTypeKind.None)
            {
                bool         flag         = true;
                EdmValueKind edmValueKind = valueKind;
                if (edmValueKind == EdmValueKind.Collection)
                {
                    if (!targetType.IsCollection())
                    {
                        flag = false;
                    }
                    else
                    {
                        return(new EdmExpressionEvaluator.AssertTypeCollectionValue(targetType.AsCollection(), (IEdmCollectionValue)operand));
                    }
                }
                else
                {
                    if (edmValueKind == EdmValueKind.Structured)
                    {
                        if (!targetType.IsStructured())
                        {
                            flag = false;
                        }
                        else
                        {
                            IEdmStructuredTypeReference edmStructuredTypeReference = targetType.AsStructured();
                            List <IEdmPropertyValue>    edmPropertyValues          = new List <IEdmPropertyValue>();
                            flag = EdmExpressionEvaluator.AssertOrMatchStructuredType(edmStructuredTypeReference, (IEdmStructuredValue)operand, true, edmPropertyValues);
                            if (flag)
                            {
                                return(new EdmStructuredValue(edmStructuredTypeReference, edmPropertyValues));
                            }
                        }
                    }
                    else
                    {
                        flag = EdmExpressionEvaluator.MatchesType(targetType, operand);
                    }
                }
                if (flag)
                {
                    return(operand);
                }
                else
                {
                    throw new InvalidOperationException(Strings.Edm_Evaluator_FailedTypeAssertion(targetType.ToTraceString()));
                }
            }
            else
            {
                return(operand);
            }
        }
예제 #2
0
        private static bool MatchesType(IEdmTypeReference targetType, IEdmValue operand, bool testPropertyTypes)
        {
            bool flag;
            IEdmTypeReference type      = operand.Type;
            EdmValueKind      valueKind = operand.ValueKind;

            if (type == null || valueKind == EdmValueKind.Null || !type.Definition.IsOrInheritsFrom(targetType.Definition))
            {
                EdmValueKind edmValueKind = valueKind;
                switch (edmValueKind)
                {
                case EdmValueKind.Binary:
                {
                    if (!targetType.IsBinary())
                    {
                        break;
                    }
                    IEdmBinaryTypeReference edmBinaryTypeReference = targetType.AsBinary();
                    if (!edmBinaryTypeReference.IsUnbounded)
                    {
                        int?maxLength = edmBinaryTypeReference.MaxLength;
                        if (maxLength.HasValue)
                        {
                            int?nullable = edmBinaryTypeReference.MaxLength;
                            return(nullable.Value >= (int)((IEdmBinaryValue)operand).Value.Length);
                        }
                    }
                    return(true);
                }

                case EdmValueKind.Boolean:
                {
                    return(targetType.IsBoolean());
                }

                case EdmValueKind.Collection:
                {
                    if (!targetType.IsCollection())
                    {
                        break;
                    }
                    IEdmTypeReference edmTypeReference        = targetType.AsCollection().ElementType();
                    IEnumerator <IEdmDelayedValue> enumerator = ((IEdmCollectionValue)operand).Elements.GetEnumerator();
                    using (enumerator)
                    {
                        while (enumerator.MoveNext())
                        {
                            IEdmDelayedValue current = enumerator.Current;
                            if (EdmExpressionEvaluator.MatchesType(edmTypeReference, current.Value))
                            {
                                continue;
                            }
                            flag = false;
                            return(flag);
                        }
                        return(true);
                    }
                    return(flag);
                }

                case EdmValueKind.DateTimeOffset:
                {
                    return(targetType.IsDateTimeOffset());
                }

                case EdmValueKind.DateTime:
                {
                    return(targetType.IsDateTime());
                }

                case EdmValueKind.Decimal:
                {
                    return(targetType.IsDecimal());
                }

                case EdmValueKind.Enum:
                {
                    return(((IEdmEnumValue)operand).Type.Definition.IsEquivalentTo(targetType.Definition));
                }

                case EdmValueKind.Floating:
                {
                    if (targetType.IsDouble())
                    {
                        return(true);
                    }
                    else
                    {
                        if (!targetType.IsSingle())
                        {
                            return(false);
                        }
                        else
                        {
                            return(EdmExpressionEvaluator.FitsInSingle(((IEdmFloatingValue)operand).Value));
                        }
                    }
                }

                case EdmValueKind.Guid:
                {
                    return(targetType.IsGuid());
                }

                case EdmValueKind.Integer:
                {
                    if (targetType.TypeKind() != EdmTypeKind.Primitive)
                    {
                        break;
                    }
                    EdmPrimitiveTypeKind edmPrimitiveTypeKind = targetType.AsPrimitive().PrimitiveKind();
                    if (edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Byte)
                    {
                        return(EdmExpressionEvaluator.InRange(((IEdmIntegerValue)operand).Value, (long)0, (long)0xff));
                    }
                    else if (edmPrimitiveTypeKind == EdmPrimitiveTypeKind.DateTime || edmPrimitiveTypeKind == EdmPrimitiveTypeKind.DateTimeOffset || edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Decimal || edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Guid)
                    {
                        break;
                    }
                    else if (edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Double || edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Int64 || edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Single)
                    {
                        return(true);
                    }
                    else if (edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Int16)
                    {
                        return(EdmExpressionEvaluator.InRange(((IEdmIntegerValue)operand).Value, (long)-32768, (long)0x7fff));
                    }
                    else if (edmPrimitiveTypeKind == EdmPrimitiveTypeKind.Int32)
                    {
                        return(EdmExpressionEvaluator.InRange(((IEdmIntegerValue)operand).Value, (long)-2147483648, (long)0x7fffffff));
                    }
                    else if (edmPrimitiveTypeKind == EdmPrimitiveTypeKind.SByte)
                    {
                        return(EdmExpressionEvaluator.InRange(((IEdmIntegerValue)operand).Value, (long)-128, (long)127));
                    }
                    break;
                }

                case EdmValueKind.Null:
                {
                    return(targetType.IsNullable);
                }

                case EdmValueKind.String:
                {
                    if (!targetType.IsString())
                    {
                        break;
                    }
                    IEdmStringTypeReference edmStringTypeReference = targetType.AsString();
                    if (!edmStringTypeReference.IsUnbounded)
                    {
                        int?maxLength1 = edmStringTypeReference.MaxLength;
                        if (maxLength1.HasValue)
                        {
                            int?nullable1 = edmStringTypeReference.MaxLength;
                            return(nullable1.Value >= ((IEdmStringValue)operand).Value.Length);
                        }
                    }
                    return(true);
                }

                case EdmValueKind.Structured:
                {
                    if (!targetType.IsStructured())
                    {
                        break;
                    }
                    return(EdmExpressionEvaluator.AssertOrMatchStructuredType(targetType.AsStructured(), (IEdmStructuredValue)operand, testPropertyTypes, null));
                }

                case EdmValueKind.Time:
                {
                    return(targetType.IsTime());
                }
                }
                return(false);
            }
            else
            {
                return(true);
            }
            return(true);
        }