private object AsClrValue(IEdmValue edmValue, Type clrType, bool convertEnumValues)
        {
            object   obj      = null;
            TypeCode typeCode = PlatformHelper.GetTypeCode(clrType);

            if (typeCode != TypeCode.Object)
            {
                bool flag = clrType.IsEnum();
                if (flag)
                {
                    IEdmEnumValue edmEnumValue = edmValue as IEdmEnumValue;
                    if (edmEnumValue != null)
                    {
                        edmValue = edmEnumValue.Value;
                    }
                }
                if (EdmToClrConverter.TryConvertAsPrimitiveType(PlatformHelper.GetTypeCode(clrType), edmValue, out obj))
                {
                    if (!flag || !convertEnumValues)
                    {
                        return(obj);
                    }
                    else
                    {
                        return(this.GetEnumValue(obj, clrType));
                    }
                }
                else
                {
                    throw new InvalidCastException(Strings.EdmToClr_UnsupportedTypeCode(typeCode));
                }
            }
            else
            {
                if (!clrType.IsGenericType() || !(clrType.GetGenericTypeDefinition() == EdmToClrConverter.TypeNullableOfT))
                {
                    if (clrType != typeof(DateTime))
                    {
                        if (clrType != typeof(DateTimeOffset))
                        {
                            if (clrType != typeof(TimeSpan))
                            {
                                if (clrType != typeof(byte[]))
                                {
                                    if (!clrType.IsGenericType() || !clrType.IsInterface() || !(clrType.GetGenericTypeDefinition() == EdmToClrConverter.TypeICollectionOfT) && !(clrType.GetGenericTypeDefinition() == EdmToClrConverter.TypeIListOfT) && !(clrType.GetGenericTypeDefinition() == EdmToClrConverter.TypeIEnumerableOfT))
                                    {
                                        return(this.AsClrObject(edmValue, clrType));
                                    }
                                    else
                                    {
                                        return(this.AsListOfT(edmValue, clrType));
                                    }
                                }
                                else
                                {
                                    return(EdmToClrConverter.AsClrByteArray(edmValue));
                                }
                            }
                            else
                            {
                                return(EdmToClrConverter.AsClrTime(edmValue));
                            }
                        }
                        else
                        {
                            return(EdmToClrConverter.AsClrDateTimeOffset(edmValue));
                        }
                    }
                    else
                    {
                        return(EdmToClrConverter.AsClrDateTime(edmValue));
                    }
                }
                else
                {
                    if (edmValue as IEdmNullValue == null)
                    {
                        return(this.AsClrValue(edmValue, clrType.GetGenericArguments().Single <Type>()));
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
        }