/// <summary>
        /// Helper method for visiting null or empty properties
        /// </summary>
        /// <param name="payloadElement">The property to visit</param>
        protected override void VisitEmptyOrNullProperty(PropertyInstance payloadElement)
        {
            base.VisitEmptyOrNullProperty(payloadElement);

            var property = this.MetadataStack.Peek() as MemberProperty;
            var navigation = this.MetadataStack.Peek() as NavigationProperty;

            if (property != null)
            {
                ExceptionUtilities.Assert(payloadElement.Name == property.Name, "Property name mismatch");
                payloadElement.AddAnnotationIfNotExist(new MemberPropertyAnnotation() { Property = property });
            }
            else
            {
                ExceptionUtilities.CheckObjectNotNull(navigation, "Expected property or navigation, got '{0}'", this.MetadataStack.Peek());
                ExceptionUtilities.Assert(payloadElement.Name == navigation.Name, "Property name mismatch");
                payloadElement.AddAnnotationIfNotExist(new NavigationPropertyAnnotation() { Property = navigation });

                var emptyCollection = payloadElement as EmptyCollectionProperty;
                if (emptyCollection != null && emptyCollection.Value != null)
                {
                    emptyCollection.Value.AddAnnotationIfNotExist(new EntitySetAnnotation() { EntitySet = this.CurrentEntitySet.GetRelatedEntitySet(navigation) });
                }
            }
        }
        /// <summary>
        /// Helper method for visiting properties
        /// </summary>
        /// <param name="payloadElement">The property to visit</param>
        /// <param name="value">The value of the property</param>
        protected override void VisitProperty(PropertyInstance payloadElement, ODataPayloadElement value)
        {
            ExceptionUtilities.CheckArgumentNotNull(payloadElement, "payloadElement");
            var property = this.MetadataStack.Peek() as MemberProperty;
            if (property != null)
            {
                ExceptionUtilities.Assert(payloadElement.Name == property.Name, "Property name mismatch");
                payloadElement.AddAnnotationIfNotExist(new MemberPropertyAnnotation() { Property = property });

                try
                {
                    this.MetadataStack.Push(property.PropertyType);
                    base.VisitProperty(payloadElement, value);
                }
                finally
                {
                    this.MetadataStack.Pop();
                }
            }
            else
            {
                var navprop = this.MetadataStack.Peek() as NavigationProperty;
                if (navprop != null)
                {
                    ExceptionUtilities.Assert(payloadElement.Name == navprop.Name, "Property name mismatch");
                    try
                    {
                        this.MetadataStack.Push(this.CurrentEntitySet.GetRelatedEntitySet(navprop));
                        base.VisitProperty(payloadElement, value);
                    }
                    finally
                    {
                        this.MetadataStack.Pop();
                    }
                }
                else
                {
                    var serviceOperation = this.MetadataStack.OfType<Function>().SingleOrDefault(f => f.Name.Equals(payloadElement.Name, StringComparison.Ordinal));
                    if (payloadElement.Name.Contains('.'))
                    {
                        // if the action has a name collision with a property in the entity, it will have the <container name>.<action name> in the payload
                        // split the payloadElement.Name and get the last token which will match the function name
                        string lastToken = payloadElement.Name.Split('.').Last();
                        serviceOperation = this.MetadataStack.OfType<Function>().SingleOrDefault(f => f.Name.Equals(lastToken, StringComparison.Ordinal));
                    }

                    ExceptionUtilities.CheckObjectNotNull(serviceOperation, "Expected property, got " + this.MetadataStack.Peek().ToString());

                    // Non-entity values returned from a service operation call appear identical to member properties,
                    // with the operation name as the property name
                    base.VisitProperty(payloadElement, value);
                }
            }
        }