Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }