/// <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); }
/// <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); } } }