/// <summary>
 /// Возвращает расширенные метаданные класса
 /// </summary>
 /// <param name="classInfo">Исходные метаданные класса</param>
 /// <returns>Расширенные метаданные класса</returns>
 public ReflectionClassInfoEx GetClassInfoEx(XPClassInfo classInfo)
 {
     ReflectionClassInfoEx result;
     if (!classesByType.TryGetValue(classInfo.ClassType, out result))
     {
         result = new ReflectionClassInfoEx(classInfo, this);
         classesByType.Add(classInfo.ClassType, result);
     }
     return result;
 }
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="classInfo">Исходные метаданные класса</param>
        /// <param name="dictionary">Справочник расширенных метаданных</param>
        public ReflectionClassInfoEx(XPClassInfo classInfo, ReflectionDictionaryEx dictionary)
        {
            this.sourceInfo = classInfo;
            this.dictionary = dictionary;
            this.baseClassEx = classInfo.BaseClass != null ? dictionary.GetClassInfoEx(classInfo.BaseClass) : null;

            // Все атрибуты класса, включая наследованные и однотипные
            object[] attributes = ClassType.GetCustomAttributes(true);
            allAttributes = new Attribute[attributes != null ? attributes.Length : 0];
            if (attributes != null && attributes.Length > 0)
                Array.Copy(attributes, allAttributes, attributes.Length);
        }