/// <summary> /// Возвращает идентификатор указанного типа объектов <paramref name="type"/>. /// </summary> /// <param name="type">Тип объектов, для которого следует получить идентификатор.</param> /// <exception cref="ArgumentNullException">Возникает, если <paramref name="type"/> равен null.</exception> public static ItemType GetItemType(Type type) { if (type == null) { throw new ArgumentNullException(nameof(type), "Следует указать тип объекта"); } var t = type; var aliasTypeAttribute = type.GetCustomAttribute <ItemTypeAliasAttribute>(true); if (aliasTypeAttribute != null) { return(GetItemType(aliasTypeAttribute.AliasType)); } var itemTypeAttribute = type.GetCustomAttribute <ItemTypeAttribute>(true); if (itemTypeAttribute != null) { return(GetItemType(itemTypeAttribute.IdItemType)); } if (t.FullName.StartsWith("System.Data.Entity.DynamicProxies.")) { t = t.BaseType; } var caption = t.Name; var displayAttribute = t.GetCustomAttribute <DisplayAttribute>(); if (displayAttribute != null && !string.IsNullOrEmpty(displayAttribute.Name)) { caption = displayAttribute.Name; } var displayNameAttribute = t.GetCustomAttribute <DisplayNameAttribute>(); if (displayNameAttribute != null && !string.IsNullOrEmpty(displayNameAttribute.DisplayName)) { caption = displayNameAttribute.DisplayName; } var fullName = TypeNameHelper.GetFullNameCleared(t); var ret = GetOrAdd(caption, "TYPEKEY_" + fullName, true); _itemsClsTypes[ret.IdItemType] = t; return(ret); }
/// <summary> /// Возвращает cls-тип для указанного типа объектов. /// </summary> /// <param name="idItemType"></param> /// <returns></returns> public static Type GetClsType(int idItemType) { var itemType = GetItemType(idItemType); if (itemType == null) { throw new InvalidOperationException("Неизвестный тип объектов."); } var funcGet = new Func <Type>(() => { Type type = null; if (itemType.UniqueKey.StartsWith("TYPEKEY_")) { var typeName = itemType.UniqueKey.Substring("TYPEKEY_".Length); if (!string.IsNullOrEmpty(typeName)) { foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var type2 in assembly.GetTypes()) { var typeName2 = TypeNameHelper.GetFullNameCleared(type2); if (typeName2 == typeName) { type = type2; break; } } if (type != null) { break; } } } } return(type); }); var value = _itemsClsTypes.GetOrAdd( itemType.IdItemType, k => funcGet() ); return(value); }