internal bool ShouldIncludeOperationMetadata(PayloadMetadataKind.Operation kind, Func<bool> checkIfUserValue)
        {
            Debug.Assert(Enum.IsDefined(typeof(PayloadMetadataKind.Operation), kind), "Invalid enum value");

            if (this.metadataParameterValue == MetadataParameterValue.Full)
            {
                return true;
            }

            if (this.metadataParameterValue == MetadataParameterValue.None)
            {
                return false;
            }

            Debug.Assert(kind == PayloadMetadataKind.Operation.Title || kind == PayloadMetadataKind.Operation.Target, "Unexpected metadata kind: " + kind);

            // Default case:
            // Operation metadata is generated based on conventions and should be left out by default, unless it was changed by the user.
            // This is specifically the case for the operations's Title and Target.
            Debug.Assert(checkIfUserValue != null, "checkIfUserValue != null");
            return checkIfUserValue();
        }
        internal bool ShouldIncludeFeedMetadata(PayloadMetadataKind.Feed kind)
        {
            Debug.Assert(Enum.IsDefined(typeof(PayloadMetadataKind.Feed), kind), "Invalid enum value");

            if (this.metadataParameterValue == MetadataParameterValue.Full)
            {
                return true;
            }

            if (this.metadataParameterValue == MetadataParameterValue.None)
            {
                return false;
            }

            Debug.Assert(this.metadataParameterValue == MetadataParameterValue.Minimal, "Unexpected metadata parameter value: " + this.metadataParameterValue);
            Debug.Assert(kind == PayloadMetadataKind.Feed.Id, "Unexpected metadata kind: " + kind);

            // Default case:
            // Feed Ids are generated based on conventions and should be left out by default.
            return false;
        }
        internal bool ShouldIncludeStreamMetadata(PayloadMetadataKind.Stream kind)
        {
            Debug.Assert(Enum.IsDefined(typeof(PayloadMetadataKind.Stream), kind), "Invalid enum value");

            if (this.metadataParameterValue == MetadataParameterValue.Full)
            {
                return true;
            }

            if (this.metadataParameterValue == MetadataParameterValue.None)
            {
                return false;
            }

            Debug.Assert(this.metadataParameterValue == MetadataParameterValue.Minimal, "Unexpected metadata parameter value: " + this.metadataParameterValue);
            Debug.Assert(
                kind == PayloadMetadataKind.Stream.ContentType
                || kind == PayloadMetadataKind.Stream.ETag
                || kind == PayloadMetadataKind.Stream.EditLink
                || kind == PayloadMetadataKind.Stream.ReadLink,
                "Unexpected metadata kind: " + kind);

            // Default case:
            // Most stream metadata is generated by the custom provider and cannot be computed client-side, and must be included by default.
            // This is specifically the case for the streams's Content-Type, Read-Link, and ETag.
            // However, the stream's edit-link is generated based on conventions and should be left out by default.
            return kind != PayloadMetadataKind.Stream.EditLink;
        }
        internal bool ShouldIncludeAssociationMetadata(PayloadMetadataKind.Association kind)
        {
            Debug.Assert(Enum.IsDefined(typeof(PayloadMetadataKind.Association), kind), "Invalid enum value");

            if (this.metadataParameterValue == MetadataParameterValue.Full)
            {
                return true;
            }

            if (this.metadataParameterValue == MetadataParameterValue.None)
            {
                return false;
            }

            Debug.Assert(this.metadataParameterValue == MetadataParameterValue.Minimal, "Unexpected metadata parameter value: " + this.metadataParameterValue);
            Debug.Assert(kind == PayloadMetadataKind.Association.Url, "Unexpected metadata kind: " + kind);

            // Default case:
            // Association link metadata is generated based on conventions and should be left out by default.
            // This is specifically the case for the links's Url.
            return false;
        }
        internal bool ShouldIncludeEntryMetadata(PayloadMetadataKind.Entry kind)
        {
            Debug.Assert(Enum.IsDefined(typeof(PayloadMetadataKind.Entry), kind), "Invalid enum value");
            Debug.Assert(kind != PayloadMetadataKind.Entry.TypeName, "Must use other helper method 'ShouldIncludeEntryTypeName' instead");

            if (this.metadataParameterValue == MetadataParameterValue.Full)
            {
                return true;
            }

            if (this.metadataParameterValue == MetadataParameterValue.None)
            {
                return false;
            }

            Debug.Assert(this.metadataParameterValue == MetadataParameterValue.Minimal, "Unexpected metadata parameter value: " + this.metadataParameterValue);
            Debug.Assert(
                kind == PayloadMetadataKind.Entry.Id
                || kind == PayloadMetadataKind.Entry.ETag
                || kind == PayloadMetadataKind.Entry.EditLink,
                "Unexpected metadata kind: " + kind);

            if (kind == PayloadMetadataKind.Entry.ETag)
            {
                return true;
            }

            // Default case:
            // Entry-metadata is generated based on conventions and should be left out by default.
            // This is specifically the case for the entity's Id and Edit-Link.
            return false;
        }