예제 #1
0
        /// <summary>
        /// Find description
        /// </summary>
        public PropertyContainerDescription FindDescription(String propertyName, PropertyContainerDescription context)
        {
            if (propertyName == null)
            {
                return(null);
            }
            PropertyContainerDescription retVal = null;
            String pathName    = propertyName;
            var    pathContext = context;

            while (pathContext != null)
            {
                pathName    = pathContext.GetName() + "." + pathName;
                pathContext = pathContext.Parent;
            }

            if (!this.m_description.TryGetValue(pathName, out retVal))
            {
                // Find the property information
                retVal = context?.FindProperty(propertyName);
                if (retVal == null)
                {
                    retVal = context?.FindProperty("*");
                }
                lock (this.m_lockObject)
                    if (!this.m_description.ContainsKey(pathName))
                    {
                        this.m_description.Add(pathName, retVal);
                    }
            }
            return(retVal);
        }
예제 #2
0
        /// <summary>
        /// Merge internal
        /// </summary>
        private static void MergeInternal(PropertyContainerDescription victim, PropertyContainerDescription merged)
        {
            if (victim.All && !merged.All)
            {
                merged.All = victim.All;
            }
            if (victim.Ref != merged.Ref && merged.Ref == null)
            {
                merged.Ref = victim.Ref;
            }
            if ((victim is PropertyModelDescription) &&
                (victim as PropertyModelDescription).Action != SerializationBehaviorType.Default &&
                (victim as PropertyModelDescription).Action < (merged as PropertyModelDescription)?.Action)
            {
                (merged as PropertyModelDescription).Action = (victim as PropertyModelDescription).Action;
            }

            foreach (var td in victim.Properties)
            {
                var mergeModel = merged.FindProperty(td.Name);
                if (mergeModel == null)
                {
                    merged.Properties.Add(td);
                }
                else
                {
                    MergeInternal(td, mergeModel);
                }
            }
        }