/// <summary> /// УДАЛЕНИЕ ДУБЛИКАТОВ СВОЙСТВ /// Обход классов. Заполнение словарей для быстрого поиска классов /// </summary> /// <param name="class"></param> private void SurveyClass(Class @class) { @class.PropsCorrection(); if (!String.IsNullOrWhiteSpace(@class.Code))//Классы без кода останутся но не попадают в словари { ClassLookUpByCode.Add(@class.Code, @class); if (@class.Properties.Count > 0) { string key = GetClassKey(@class.Properties); //Если есть 2 класса с одинаковым набором свойств, то словаре будет только один из них if (!ClassLookUpByProps.ContainsKey(key)) { ClassLookUpByProps.Add(key, @class); } } else { //обнаружен класс без свойств. Он подходит по имени? for (int i = 0; i < Classifier.DefaultClasses.Length; i++) { if (DefClassesWithNoProps[i] == null && @class.Name.Equals(Classifier.DefaultClasses[i])) { DefClassesWithNoProps[i] = @class; } } } } foreach (Class nestedClass in @class.NestedClasses) { SurveyClass(nestedClass); } }
private string GetUniqueClassCode() { int n = 1; while (ClassLookUpByCode.ContainsKey(n.ToString())) { n++; } return(n.ToString()); }
/// <summary> /// Заполнение свойств объекта в соответствии с классами. Присвоение ссылки на класс. Создание класса если еще нет /// </summary> /// <param name="obj"></param> /// <param name="categories"></param> private void SetObjectProps(XML.St.Object obj, PropertyCategoryCollection categories, int defClassNum, int defClassLevelNum) { List <XML.Cl.Property> clProps = null; List <XML.St.Property> stProps = null; string actualKey = AnalizeNavisProps(categories, out clProps, out stProps); //Сначала присвоить правильный класс Class @class = null; //Проверить есть ли у объекта уже ссылка на класс if (!String.IsNullOrEmpty(obj.ClassCode)) { //Найти этот класс ClassLookUpByCode.TryGetValue(obj.ClassCode, out @class); if (@class != null) { //Если класс есть, то проверить его свойства string currKey = GetClassKey(@class.Properties); if (currKey == null || !currKey.Equals(actualKey)) { //Если этот класс не подходит по свойствам, то он должен быть переназначен @class = null; } } } if (@class == null) { //Проверить есть ли класс подходящий по свойствам if (actualKey == null) { //Свойств нет - присвоить дефолный класс без свойств @class = DefClassesWithNoProps[defClassNum]; } else { //Поиск существующего класса подходящего по свойствам ClassLookUpByProps.TryGetValue(actualKey, out @class); if (@class == null) { //Подходящий класс не найден. Создать его @class = CreateNewClass(Classifier.ClassName /*NEW_CLASS_NAME*/, Classifier.ClassName /*NEW_CLASS_NAME_IN_PLURAL*/, defClassLevelNum, actualKey, clProps); } } } //Присвоить объекту ссылку на актуальный класс obj.ClassCode = @class.Code; //Задать свойства для объекта obj.Properties = stProps; }
/// <summary> /// Создает класс и добавляет его во все нужные словари /// </summary> /// <param name="Name"></param> /// <param name=""></param> /// <returns></returns> private Class CreateNewClass(string name, string nameInPlural, int defLevelNum, string propKey = null, List <XML.Cl.Property> clProps = null) { //string code = GetUniqueClassCode(); string code = Guid.NewGuid().ToString(); Class @class = new Class() { Name = name, NameInPlural = nameInPlural, DetailLevel = DefDetailLevels[defLevelNum], Code = code }; ClassLookUpByCode.Add(code, @class); Classifier.NestedClasses.Add(@class); if (propKey != null && clProps != null) { @class.Properties = clProps; ClassLookUpByProps.Add(propKey, @class); } return(@class); }