예제 #1
0
        /// <summary>
        /// Возвращает тип указанного объекта.
        /// </summary>
        public static int GetValueFromType(Type t)
        {
            if (!_knownTypes.ContainsKey(t))
            {
                var attr = t.GetCustomAttribute <ItemTypeAttribute>(true);
                if (attr != null)
                {
                    _knownTypes[t] = attr.IdItemType;
                }
            }

            if (_knownTypes.ContainsKey(t))
            {
                return(_knownTypes[t]);
            }

            var itemType = ItemTypeFactory.GetItemType(t);

            if (itemType != null)
            {
                return(itemType.IdItemType);
            }

            throw new InvalidOperationException("Не удалось определить тип объекта.");
        }
예제 #2
0
        /// <summary>
        /// Связывает тип объекта <typeparamref name="TItemBase"/> с модулем типа <typeparamref name="TModule"/>.
        /// </summary>
        /// <seealso cref="ModuleCore{TSelfReference}.QueryType"/>
        /// <seealso cref="ItemTypeAliasAttribute"/>
        internal void RegisterModuleItemType <TItemBase, TModule>(TModule module)
            where TItemBase : ItemBase
            where TModule : ModuleCore
        {
            var type      = typeof(TItemBase);
            var typesList = new List <Type>()
            {
                type
            };

            while (true)
            {
                var aliasTypeAttribute = type.GetCustomAttribute <ItemTypeAliasAttribute>(true);
                if (aliasTypeAttribute != null)
                {
                    if (typesList.Contains(aliasTypeAttribute.AliasType))
                    {
                        throw new InvalidOperationException($"Нижестоящий тип '{type.FullName}' ссылается на вышестоящий '{aliasTypeAttribute.AliasType}'.");
                    }
                    if (type != aliasTypeAttribute.AliasType)
                    {
                        type = aliasTypeAttribute.AliasType;
                        typesList.Add(type);
                        continue;
                    }
                }

                break;
            }

            var itemType = ItemTypeFactory.GetItemType(type);

            _itemTypeModuleType[type] = new Tuple <ItemType, Type>(itemType, typeof(TModule));

            using (var db = new DataContext())
            {
                var query = db.ItemParent.Where(x => x.IdItemType == itemType.IdItemType && x.IdModule == module.IdModule);
                if (query.Count() == 0)
                {
                    SaveChildToParentRelations(module, itemType.IdItemType, new ChildToParentRelation()
                    {
                        IdChild = 0, IdParent = 0
                    }.ToEnumerable());
                }
            }
        }