public static TypeInfo Create(Type T)
        {
            string typeId = NameUtility.GetTypeIdentifier(T);

            return(new TypeInfo()
            {
                typeIdentifier = typeId
            });
        }
        public RawTypeInfo(Type T)
        {
            this.fullName      = NameUtility.GetTypeIdentifier(T);
            this.namespaceName = NameUtility.GetTypeNamespaceName(T);
            this.className     = NameUtility.GetTypeClassName(T);
            this.isGeneric     = T.IsGenericType;
            this.isArray       = T.IsArray;

            if (this.isGeneric)
            {
                this.genericArguments.AddRange(T.GenericTypeArguments.Select(t => NameUtility.GetTypeIdentifier(t)));
            }

            if (T.BaseType != null)
            {
                this.baseClass = NameUtility.GetTypeIdentifier(T.BaseType);
            }

            // fields
            foreach (var field in T.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                var fieldName = field.Name;
                if (!TypeFilter.IsBannedField(field))
                {
                    var rawFieldInfo = new RawFieldInfo(field);
                    fields.Add(rawFieldInfo.Name, rawFieldInfo);
                }
            }

            // attributes
            foreach (var attrib in T.CustomAttributes)
            {
                var type = attrib.AttributeType;
                if (!this.attributes.ContainsKey(type.Name))
                {
                    this.attributes.Add(type.Name, NameUtility.GetTypeIdentifier(type));
                }
            }

            // useful methods
            var methods = T.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            foreach (var method in methods)
            {
                switch (method.Name)
                {
                case "LoadDataFromXmlCustom":
                    this.methods.Add(method.Name);
                    break;
                }
            }
        }
        public RawFieldInfo(FieldInfo fieldInfo)
        {
            this.Name          = fieldInfo.Name;
            this.declaringType = NameUtility.GetTypeIdentifier(fieldInfo.DeclaringType);
            this.fieldType     = NameUtility.GetTypeIdentifier(fieldInfo.FieldType);
            this.isPublic      = fieldInfo.IsPublic;
            this.isPrivate     = fieldInfo.IsPrivate;

            foreach (var attrib in fieldInfo.CustomAttributes)
            {
                if (!attrib.AttributeType.IsSpecialName)
                {
                    var attribType = attrib.AttributeType;
                    attributes.Add(attribType.Name, NameUtility.GetTypeIdentifier(attribType));
                }
            }
        }
        static void PopulateData()
        {
            foreach (var pair in typeDict)
            {
                var type        = pair.Key;
                var rawTypeInfo = pair.Value;

                if (type.Name.Contains("CompProperties"))
                {
                    var baseType = type;
                    var objType  = typeof(object);
                    while (baseType != null && baseType.BaseType != objType && baseType.Name.Contains("CompProperties"))
                    { // possible bug - baseType was not registered in static typeDict, maybe
                      // also if CompProperties have interface, then it will throw the error cuz baseType is null
                      // I'm just adding baseType != null to avoid critical issues, fix this later
                        baseType = baseType.BaseType;
                    }

                    rawTypeInfo.metadata.compClass.baseClass = NameUtility.GetTypeIdentifier(baseType);
                }

                rawTypeInfo.populated = true;
            }
        }