/// <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("Не удалось определить тип объекта."); }
/// <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()); } } }