public override void Merge(XStorageObjectBase p_xobj) { base.Merge(p_xobj); XStorageObjectToSave xobj = p_xobj as XStorageObjectToSave; if (xobj == null) { Debug.Fail("Некорректная реализация XStorageObjectBase::Merge"); throw new ArgumentException(); } UpdateTS = UpdateTS | xobj.UpdateTS; if (xobj.IsToInsert) { m_state = XStorageObjectState.ToInsert; } foreach (string sPropName in xobj.Props.Keys) { if (!Props.Contains(sPropName)) { // свойства не было - добавим Props[sPropName] = xobj.Props[sPropName]; } else { XStorageObjectPropMergeModes mergeModeThis = GetPropMergeMode(sPropName); XStorageObjectPropMergeModes mergeModeForeign = xobj.GetPropMergeMode(sPropName); // если хотя бы для одного свойства стоит флаг "слабой" проверки, то отключаем проверку на совпадание значений свойств if (mergeModeThis == XStorageObjectPropMergeModes.Replace) { Debug.Assert(mergeModeForeign != XStorageObjectPropMergeModes.Replace, "Два свойства с признаком перезаписи - это некорректная ситуация"); // у текущего св-ва задан атрибут перезаписи, поэтому оставляем его в неприкосновенности (даже проверки не делаем) } else if (mergeModeForeign == XStorageObjectPropMergeModes.Replace) { Props[sPropName] = xobj.Props[sPropName]; } else { if (!isPropsEquals(Props[sPropName], xobj.Props[sPropName])) { throw new XMergeConflictException("Значения свойста " + sPropName + " отличаются: '" + Props[sPropName] + "' и '" + xobj.Props[sPropName] + "'"); } } } } // смерджим словарь свойств, данные которых загружены механизмом кусочного сохранения if (xobj.PropertiesWithChunkedData.Count > 0) { foreach (string sPropName in xobj.PropertiesWithChunkedData.Keys) { PropertiesWithChunkedData[sPropName] = xobj.PropertiesWithChunkedData[sPropName]; } } ParticipateInUniqueIndex = xobj.ParticipateInUniqueIndex | ParticipateInUniqueIndex; }
public IDictionary GetPropsByCapacity(params XPropCapacity[] propCapacities) { XPropInfoObject[] propInfos = TypeInfo.GetPropsByCapacities(propCapacities); HybridDictionary props = new HybridDictionary(propInfos.Length); foreach (XPropInfoObject propInfo in propInfos) { if (Props.Contains(propInfo.Name)) { props.Add(propInfo.Name, Props[propInfo.Name]); } } return(props); }
public IDictionary GetPropsByType(params XPropType[] propTypes) { HybridDictionary props = new HybridDictionary(); foreach (XPropInfoBase propInfo in TypeInfo.Properties) { foreach (XPropType propType in propTypes) { if (propType == propInfo.VarType) { if (Props.Contains(propInfo.Name)) { props.Add(propInfo.Name, Props[propInfo.Name]); } break; } } } return(props); }