private object AsClrObject(IEdmValue edmValue, Type clrObjectType)
        {
            object obj = null;
            bool   flag;

            EdmUtil.CheckArgumentNull <IEdmValue>(edmValue, "edmValue");
            EdmUtil.CheckArgumentNull <Type>(clrObjectType, "clrObjectType");
            if (edmValue as IEdmNullValue == null)
            {
                IEdmStructuredValue edmStructuredValue = edmValue as IEdmStructuredValue;
                if (edmStructuredValue != null)
                {
                    if (!this.convertedObjects.TryGetValue(edmStructuredValue, out obj))
                    {
                        if (clrObjectType.IsClass())
                        {
                            if (this.tryCreateObjectInstanceDelegate == null || !this.tryCreateObjectInstanceDelegate(edmStructuredValue, clrObjectType, this, out obj, out flag))
                            {
                                obj  = Activator.CreateInstance(clrObjectType);
                                flag = false;
                            }
                            else
                            {
                                if (obj != null)
                                {
                                    Type type = obj.GetType();
                                    if (clrObjectType.IsAssignableFrom(type))
                                    {
                                        clrObjectType = type;
                                    }
                                    else
                                    {
                                        throw new InvalidCastException(Strings.EdmToClr_TryCreateObjectInstanceReturnedWrongObject(type.FullName, clrObjectType.FullName));
                                    }
                                }
                            }
                            this.convertedObjects[edmStructuredValue] = obj;
                            if (!flag && obj != null)
                            {
                                this.PopulateObjectProperties(edmStructuredValue, obj, clrObjectType);
                            }
                            return(obj);
                        }
                        else
                        {
                            throw new InvalidCastException(Strings.EdmToClr_StructuredValueMappedToNonClass);
                        }
                    }
                    else
                    {
                        return(obj);
                    }
                }
                else
                {
                    if (edmValue as IEdmCollectionValue == null)
                    {
                        throw new InvalidCastException(Strings.EdmToClr_CannotConvertEdmValueToClrType(EdmToClrConverter.GetEdmValueInterfaceName(edmValue), clrObjectType.FullName));
                    }
                    else
                    {
                        throw new InvalidCastException(Strings.EdmToClr_CannotConvertEdmCollectionValueToClrType(clrObjectType.FullName));
                    }
                }
            }
            else
            {
                return(null);
            }
        }