/// <summary>
        /// Removes a data object from the internal dictionary by key.
        /// </summary>
        /// <param name="key">The key for the data object to remove.</param>
        public void Remove(string key)
        {
            if (!ChildDataObjects.ContainsKey(key))
            {
                return;
            }

            if (Constants.StringComparer.Compare(_lastUsedDataObject.Namespace, key) == 0)
            {
                _lastUsedDataObject = null;
            }

            TC childDataObject;

            ChildDataObjects.TryRemove(key, out childDataObject);
            childDataObject.ParentMetaObject = null;
        }
        /// <summary>
        /// Removes a data object from the internal dictionary by value.
        /// </summary>
        /// <param name="childDataObject">The child data object to remove.</param>
        public void Remove(TC childDataObject)
        {
            if (!ChildDataObjects.ContainsKey(childDataObject.Namespace))
            {
                return;
            }

            if (Constants.StringComparer.Compare(_lastUsedDataObject.Namespace, childDataObject.Namespace) == 0 ||
                _lastUsedDataObject.Equals(childDataObject))
            {
                _lastUsedDataObject = null;
            }

            TC childDataObjectToRemove;

            ChildDataObjects.TryRemove(childDataObject.Namespace, out childDataObjectToRemove);
            childDataObject.ParentMetaObject = null;
        }