/// <summary>Returns a deep clone of this DCM. Caller is responsible to choose a unique FilePath</summary>
        public DictionaryConfigurationModel DeepClone()
        {
            var clone = new DictionaryConfigurationModel();

            // Copy everything over at first, importantly handling strings and primitives.
            var properties = typeof(DictionaryConfigurationModel).GetProperties();

            foreach (var property in properties.Where(prop => prop.CanWrite))             // Skip any read-only properties
            {
                var originalValue = property.GetValue(this, null);
                property.SetValue(clone, originalValue, null);
            }

            // Deep-clone SharedItems
            if (SharedItems != null)
            {
                clone.SharedItems = SharedItems.Select(node => node.DeepCloneUnderParent(null, true)).ToList();
            }

            // Deep-clone Parts
            if (Parts != null)
            {
                clone.Parts = Parts.Select(node => node.DeepCloneUnderParent(null, true)).ToList();
                SpecifyParentsAndReferences(clone.Parts, clone.SharedItems);
            }

            // Clone Publications
            if (Publications != null)
            {
                clone.Publications = new List <string>(Publications);
            }

            return(clone);
        }