Пример #1
0
 private static DBTypeModel EmitDeclaringTypeDatabase(BaseTypeMetadata declaringType)
 {
     if (declaringType == null)
     {
         return(null);
     }
     return(EmitReferenceDatabase(declaringType));
 }
Пример #2
0
 public static IEnumerable <DBTypeModel> CheckGenericArgumentsDatabase(BaseTypeMetadata typeMetadata)
 {
     if (typeMetadata.GenericArguments != null)
     {
         return(EmitGenericArgumentsDatabase(typeMetadata.GenericArguments));
     }
     return(null);
 }
Пример #3
0
 private static DBTypeModel EmitExtendsDatabase(BaseTypeMetadata baseType)
 {
     if (baseType == null)
     {
         return(null);
     }
     return(EmitReferenceDatabase(baseType));
 }
Пример #4
0
 public ParameterMetadata MapUp(BaseParameterMetadata model)
 {
     ParameterMetadata parameterModel = new ParameterMetadata();
     parameterModel.Name = model.Name;
     Type type = model.GetType();
     PropertyInfo typeProperty = type.GetProperty("Type", 
         BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
     BaseTypeMetadata typeModel = (BaseTypeMetadata)typeProperty?.GetValue(model);
     if (typeModel != null)
         parameterModel.Type = TypeModelMapper.EmitType(typeModel);
     return parameterModel;
 }
Пример #5
0
        internal static DBTypeModel EmitReferenceDatabase(BaseTypeMetadata type)
        {
            if (type == null)
            {
                return(null);
            }
            if (Dictionares.TypeDictonaryToDatabase.ContainsKey(type))
            {
                return(Dictionares.TypeDictonaryToDatabase[type]);
            }

            return(MapToDB(type));
        }
Пример #6
0
        public TypeMetadata MapUp(BaseTypeMetadata model)
        {
            TypeMetadata typeModel = new TypeMetadata();

            if (model == null)
            {
                return(null);
            }

            if (!Types.ContainsKey(model.Name))
            {
                Types.Add(model.Name, typeModel);
                FillType(model, typeModel);
            }
            return(Types[model.Name]);
        }
Пример #7
0
        public static DBTypeModel MapToDB(BaseTypeMetadata typeMetadata)
        {
            DBTypeModel DatabaseTypeMetadata = new DBTypeModel
            {
                TypeName              = typeMetadata.TypeName,
                DeclaringType         = EmitDeclaringTypeDatabase(typeMetadata.DeclaringType),
                Constructors          = DBMethodMapper.EmitMethodsDatabase(typeMetadata.Constructors),
                Methods               = DBMethodMapper.EmitMethodsDatabase(typeMetadata.Methods),
                NestedTypes           = EmitNestedTypesDatabase(typeMetadata.NestedTypes),
                ImplementedInterfaces = EmitImplementsDatabase(typeMetadata.ImplementedInterfaces),
                GenericArguments      = CheckGenericArgumentsDatabase(typeMetadata),
                BaseType              = EmitExtendsDatabase(typeMetadata.BaseType),
                Properties            = DBPropertyMapper.EmitPropertiesDatabase(typeMetadata.Properties),
            };

            return(DatabaseTypeMetadata);
        }
Пример #8
0
 public static XMLTypeModel GetOrAdd(BaseTypeMetadata baseType)
 {
     if (baseType != null)
     {
         if (TypeDictionary.ContainsKey(baseType.TypeName))
         {
             return(TypeDictionary[baseType.TypeName]);
         }
         else
         {
             return(new XMLTypeModel(baseType));
         }
     }
     else
     {
         return(null);
     }
 }
Пример #9
0
        public MethodMetadata MapUp(BaseMethodMetadata model)
        {
            MethodMetadata methodModel = new MethodMetadata();

            methodModel.Name      = model.Name;
            methodModel.Extension = model.Extension;
            Type         type = model.GetType();
            PropertyInfo genericArgumentsProperty = type.GetProperty("GenericArguments",
                                                                     BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (genericArgumentsProperty?.GetValue(model) != null)
            {
                List <BaseTypeMetadata> genericArguments =
                    (List <BaseTypeMetadata>)HelperClass.ConvertList(typeof(BaseTypeMetadata),
                                                                     (IList)genericArgumentsProperty?.GetValue(model));
                methodModel.GenericArguments =
                    genericArguments.Select(g => TypeModelMapper.EmitType(g)).ToList();
            }

            methodModel.Modifiers = model.Modifiers;

            PropertyInfo parametersProperty = type.GetProperty("Parameters",
                                                               BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (parametersProperty?.GetValue(model) != null)
            {
                List <BaseParameterMetadata> parameters =
                    (List <BaseParameterMetadata>)HelperClass.ConvertList(typeof(BaseParameterMetadata),
                                                                          (IList)parametersProperty?.GetValue(model));

                methodModel.Parameters = parameters
                                         .Select(p => new ParameterModelMapper().MapUp(p)).ToList();
            }

            PropertyInfo returnTypeProperty = type.GetProperty("ReturnType",
                                                               BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
            BaseTypeMetadata returnType = (BaseTypeMetadata)returnTypeProperty?.GetValue(model);

            if (returnType != null)
            {
                methodModel.ReturnType = TypeModelMapper.EmitType(returnType);
            }
            return(methodModel);
        }
Пример #10
0
        public XMLTypeModel(BaseTypeMetadata typeBase)
        {
            if (!TypeDictionary.ContainsKey(typeBase.TypeName))
            {
                TypeDictionary.Add(typeBase.TypeName, this);
            }
            TypeName      = typeBase.TypeName;
            NamespaceName = typeBase.NamespaceName;
            TypeKind      = typeBase.TypeKind;

            BaseType      = GetOrAdd(typeBase.BaseType);
            DeclaringType = GetOrAdd(typeBase.DeclaringType);

            Modifiers = new Tuple <AccessLevel, SealedEnum, AbstractEnum>(typeBase.Modifiers.Item1, typeBase.Modifiers.Item2, typeBase.Modifiers.Item3);

            Constructors          = typeBase.Constructors?.Select(c => new XMLMethodModel(c));
            GenericArguments      = typeBase.GenericArguments?.Select(GetOrAdd);
            ImplementedInterfaces = typeBase.ImplementedInterfaces?.Select(GetOrAdd);
            Methods     = typeBase.Methods?.Select(m => new XMLMethodModel(m));
            NestedTypes = typeBase.NestedTypes?.Select(GetOrAdd);
            Properties  = typeBase.Properties?.Select(p => new XMLPropertyModel(p));
        }
Пример #11
0
        public static DBTypeModel FillTypeDatabase(DBTypeModel DTGTypeMetadata, BaseTypeMetadata typeMetadata)
        {
            DTGTypeMetadata.TypeName              = typeMetadata.TypeName;
            DTGTypeMetadata.DeclaringType         = EmitDeclaringTypeDatabase(typeMetadata.DeclaringType);
            DTGTypeMetadata.Constructors          = DBMethodMapper.EmitMethodsDatabase(typeMetadata.Constructors);
            DTGTypeMetadata.Methods               = DBMethodMapper.EmitMethodsDatabase(typeMetadata.Methods);
            DTGTypeMetadata.NestedTypes           = EmitNestedTypesDatabase(typeMetadata.NestedTypes);
            DTGTypeMetadata.ImplementedInterfaces = EmitImplementsDatabase(typeMetadata.ImplementedInterfaces);
            if (typeMetadata.GenericArguments != null)
            {
                DTGTypeMetadata.GenericArguments = EmitGenericArgumentsDatabase(typeMetadata.GenericArguments);
            }
            else
            {
                DTGTypeMetadata.GenericArguments = null;
            }
            //DTGTypeMetadata.Modifiers = EmitModifiers(typeMetadata);
            DTGTypeMetadata.BaseType   = EmitExtendsDatabase(typeMetadata.BaseType);
            DTGTypeMetadata.Properties = DBPropertyMapper.EmitPropertiesDatabase(typeMetadata.Properties);

            return(DTGTypeMetadata);
        }
Пример #12
0
        private void FillBaseType(TypeMetadata model, BaseTypeMetadata typModel)
        {
            Type typeModelType = typModel.GetType();

            typeModelType.GetProperty("Name")?.SetValue(typModel, model.Name);
            //typeModelType.GetProperty("IsExternal")?.SetValue(typModel, model.IsExternal);
            //typeModelType.GetProperty("IsGeneric")?.SetValue(typModel, model.IsGeneric);
            typeModelType.GetProperty("Type")?.SetValue(typModel, model.Type);
            typeModelType.GetProperty("NamespaceName")?.SetValue(typModel, model.NamespaceName); //?? assembly
            typeModelType.GetProperty("Modifiers")?.SetValue(typModel, model.Modifiers);         //?? new TypeModifiers());

            if (model.BaseType != null)
            {
                typeModelType.GetProperty("BaseType",
                                          BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
                ?.SetValue(typModel, typeModelType.Cast(EmitBaseType(model.BaseType, typeModelType)));
            }

            if (model.DeclaringType != null)
            {
                typeModelType.GetProperty("DeclaringType",
                                          BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
                ?.SetValue(typModel, typeModelType.Cast(EmitBaseType(model.DeclaringType, typeModelType)));
            }

            if (model.NestedTypes != null)
            {
                PropertyInfo nestedTypesProperty = typeModelType.GetProperty("NestedTypes",
                                                                             BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                nestedTypesProperty?.SetValue(typModel,
                                              HelperClass.ConvertList(typeModelType,
                                                                      model.NestedTypes?.Select(c => EmitBaseType(c, typeModelType)).ToList()));
            }

            if (model.GenericArguments != null)
            {
                PropertyInfo genericArgumentsProperty = typeModelType.GetProperty("GenericArguments",
                                                                                  BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                genericArgumentsProperty?.SetValue(typModel,
                                                   HelperClass.ConvertList(typeModelType,
                                                                           model.GenericArguments?.Select(c => EmitBaseType(c, typeModelType)).ToList()));
            }

            if (model.ImplementedInterfaces != null)
            {
                PropertyInfo implementedInterfacesProperty = typeModelType.GetProperty("ImplementedInterfaces",
                                                                                       BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                implementedInterfacesProperty?.SetValue(typModel,
                                                        HelperClass.ConvertList(typeModelType,
                                                                                model.ImplementedInterfaces?.Select(c => EmitBaseType(c, typeModelType)).ToList()));
            }

            if (model.Fields != null)
            {
                PropertyInfo fieldsProperty = typeModelType.GetProperty("Fields",
                                                                        BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                fieldsProperty?.SetValue(typModel,
                                         HelperClass.ConvertList(fieldsProperty.PropertyType.GetGenericArguments()[0],
                                                                 model.Fields?.Select(c =>
                                                                                      new ParameterModelMapper().MapDown(c,
                                                                                                                         fieldsProperty?.PropertyType.GetGenericArguments()[0])).ToList()));
            }

            if (model.Methods != null)
            {
                PropertyInfo methodsProperty = typeModelType.GetProperty("Methods",
                                                                         BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                methodsProperty?.SetValue(typModel,
                                          HelperClass.ConvertList(methodsProperty.PropertyType.GetGenericArguments()[0],
                                                                  model.Methods?.Select(m =>
                                                                                        new MethodModelMapper().MapDown(m,
                                                                                                                        methodsProperty?.PropertyType.GetGenericArguments()[0]))
                                                                  .ToList()));
            }

            if (model.Constructors != null)
            {
                PropertyInfo constructorsProperty = typeModelType.GetProperty("Constructors",
                                                                              BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                constructorsProperty?.SetValue(typModel,
                                               HelperClass.ConvertList(constructorsProperty.PropertyType.GetGenericArguments()[0],
                                                                       model.Constructors?.Select(c =>
                                                                                                  new MethodModelMapper().MapDown(c,
                                                                                                                                  constructorsProperty?.PropertyType.GetGenericArguments()[0])).ToList()));
            }

            if (model.Properties != null)
            {
                PropertyInfo propertiesProperty = typeModelType.GetProperty("Properties",
                                                                            BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
                propertiesProperty?.SetValue(typModel,
                                             HelperClass.ConvertList(propertiesProperty.PropertyType.GetGenericArguments()[0],
                                                                     model.Properties?.Select(c =>
                                                                                              new PropertyModelMapper().MapDown(c,
                                                                                                                                propertiesProperty?.PropertyType.GetGenericArguments()[0])).ToList()));
            }
        }
Пример #13
0
 public static TypeMetadata EmitType(BaseTypeMetadata model)
 {
     return(new TypeModelMapper().MapUp(model));
 }
Пример #14
0
        private void FillType(BaseTypeMetadata model, TypeMetadata typeModel)
        {
            typeModel.Name = model.Name;
            //typeModel.IsExternal = model.IsExternal;
            //typeModel.IsGeneric = model.IsGeneric;
            typeModel.Type          = model.Type;
            typeModel.NamespaceName = model.NamespaceName;
            typeModel.Modifiers     = model.Modifiers; //?? new TypeModifiers();

            Type         type             = model.GetType();
            PropertyInfo baseTypeProperty = type.GetProperty("BaseType",
                                                             BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
            BaseTypeMetadata baseType = (BaseTypeMetadata)baseTypeProperty?.GetValue(model);

            typeModel.BaseType = EmitType(baseType);

            PropertyInfo declaringTypeProperty = type.GetProperty("DeclaringType",
                                                                  BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
            BaseTypeMetadata declaringType = (BaseTypeMetadata)declaringTypeProperty?.GetValue(model);

            typeModel.DeclaringType = EmitType(declaringType);

            PropertyInfo nestedTypesProperty = type.GetProperty("NestedTypes",
                                                                BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (nestedTypesProperty?.GetValue(model) != null)
            {
                List <BaseTypeMetadata> nestedTypes = (List <BaseTypeMetadata>)HelperClass.ConvertList(typeof(BaseTypeMetadata),
                                                                                                       (IList)nestedTypesProperty?.GetValue(model));
                typeModel.NestedTypes = nestedTypes?.Select(n => EmitType(n)).ToList();
            }

            PropertyInfo genericArgumentsProperty = type.GetProperty("GenericArguments",
                                                                     BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (genericArgumentsProperty?.GetValue(model) != null)
            {
                List <BaseTypeMetadata> genericArguments =
                    (List <BaseTypeMetadata>)HelperClass.ConvertList(typeof(BaseTypeMetadata),
                                                                     (IList)genericArgumentsProperty?.GetValue(model));
                typeModel.GenericArguments = genericArguments?.Select(g => EmitType(g)).ToList();
            }

            PropertyInfo implementedInterfacesProperty = type.GetProperty("ImplementedInterfaces",
                                                                          BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (implementedInterfacesProperty?.GetValue(model) != null)
            {
                List <BaseTypeMetadata> implementedInterfaces =
                    (List <BaseTypeMetadata>)HelperClass.ConvertList(typeof(BaseTypeMetadata),
                                                                     (IList)implementedInterfacesProperty?.GetValue(model));
                typeModel.ImplementedInterfaces =
                    implementedInterfaces?.Select(i => EmitType(i)).ToList();
            }

            PropertyInfo fieldsProperty = type.GetProperty("Fields",
                                                           BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (fieldsProperty?.GetValue(model) != null)
            {
                List <BaseParameterMetadata> fields =
                    (List <BaseParameterMetadata>)HelperClass.ConvertList(typeof(BaseParameterMetadata),
                                                                          (IList)fieldsProperty?.GetValue(model));
                typeModel.Fields = fields?.Select(g => new ParameterModelMapper().MapUp(g))
                                   .ToList();
            }

            PropertyInfo methodsProperty = type.GetProperty("Methods",
                                                            BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (methodsProperty?.GetValue(model) != null)
            {
                List <BaseMethodMetadata> methods = (List <BaseMethodMetadata>)HelperClass.ConvertList(typeof(BaseMethodMetadata),
                                                                                                       (IList)methodsProperty?.GetValue(model));
                typeModel.Methods = methods?.Select(c => new MethodModelMapper().MapUp(c)).ToList();
            }

            PropertyInfo constructorsProperty = type.GetProperty("Constructors",
                                                                 BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (constructorsProperty?.GetValue(model) != null)
            {
                List <BaseMethodMetadata> constructors =
                    (List <BaseMethodMetadata>)HelperClass.ConvertList(typeof(BaseMethodMetadata),
                                                                       (IList)constructorsProperty?.GetValue(model));
                typeModel.Constructors = constructors?.Select(c => new MethodModelMapper().MapUp(c))
                                         .ToList();
            }

            PropertyInfo propertiesProperty = type.GetProperty("Properties",
                                                               BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

            if (propertiesProperty?.GetValue(model) != null)
            {
                List <BasePropertyMetadata> properties =
                    (List <BasePropertyMetadata>)HelperClass.ConvertList(typeof(BasePropertyMetadata),
                                                                         (IList)propertiesProperty?.GetValue(model));
                typeModel.Properties = properties?.Select(g => new PropertyModelMapper().MapUp(g))
                                       .ToList();
            }
        }
Пример #15
0
        public TypeMetadata(BaseTypeMetadata typeMetadata)
        {
            m_typeName      = typeMetadata.TypeName;
            m_NamespaceName = typeMetadata.NamespaceName;

            if (!BaseTypeMetadata.TypeDictionary.ContainsKey(m_typeName))
            {
                BaseTypeMetadata.TypeDictionary.Add(m_typeName, typeMetadata);
            }
            if (!m_typesMetadata.ContainsKey(m_typeName))
            {
                m_typesMetadata.Add(m_typeName, this);
            }

            if (typeMetadata.BaseType != null)
            {
                if (m_typesMetadata.ContainsKey(typeMetadata.BaseType.TypeName))
                {
                    m_BaseType = m_typesMetadata[typeMetadata.BaseType.TypeName];
                }
                else
                {
                    m_BaseType = new TypeMetadata(typeMetadata.BaseType);
                }
            }

            if (typeMetadata.GenericArguments != null)
            {
                List <TypeMetadata> genericArguments = new List <TypeMetadata>();
                foreach (BaseTypeMetadata baseMetadata in typeMetadata.GenericArguments)
                {
                    TypeMetadata metadata;
                    if (m_typesMetadata.ContainsKey(baseMetadata.TypeName))
                    {
                        metadata = m_typesMetadata[baseMetadata.TypeName];
                    }
                    else
                    {
                        metadata = new TypeMetadata(baseMetadata);
                    }
                    genericArguments.Add(metadata);
                }
                m_GenericArguments = genericArguments;
            }

            m_Modifiers = typeMetadata.Modifiers;
            //TypeKind = typeMetadata.TypeKind;

            if (typeMetadata.ImplementedInterfaces != null)
            {
                List <TypeMetadata> interfaces = new List <TypeMetadata>();
                foreach (BaseTypeMetadata baseMetadata in typeMetadata.ImplementedInterfaces)
                {
                    TypeMetadata metadata;
                    if (m_typesMetadata.ContainsKey(typeMetadata.TypeName))
                    {
                        metadata = m_typesMetadata[typeMetadata.TypeName];
                    }
                    else
                    {
                        metadata = new TypeMetadata(typeMetadata);
                    }
                    interfaces.Add(metadata);
                }
                m_ImplementedInterfaces = interfaces;
            }

            if (typeMetadata.NestedTypes != null)
            {
                List <TypeMetadata> nestedTypes = new List <TypeMetadata>();
                foreach (BaseTypeMetadata baseMetadata in typeMetadata.NestedTypes)
                {
                    TypeMetadata metadata;
                    if (m_typesMetadata.ContainsKey(baseMetadata.TypeName))
                    {
                        metadata = m_typesMetadata[baseMetadata.TypeName];
                    }
                    else
                    {
                        metadata = new TypeMetadata(baseMetadata);
                    }
                    nestedTypes.Add(metadata);
                }
                m_NestedTypes = nestedTypes;
            }

            if (typeMetadata.Properties != null)
            {
                List <PropertyMetadata> properties = new List <PropertyMetadata>();
                foreach (BasePropertyMetadata baseProperty in typeMetadata.Properties)
                {
                    PropertyMetadata propertyMetadata = new PropertyMetadata(baseProperty);
                    properties.Add(propertyMetadata);
                }
                m_Properties = properties;
            }

            if (typeMetadata.DeclaringType != null)
            {
                if (m_typesMetadata.ContainsKey(typeMetadata.DeclaringType.TypeName))
                {
                    m_DeclaringType = m_typesMetadata[typeMetadata.DeclaringType.TypeName];
                }
                else
                {
                    m_DeclaringType = new TypeMetadata(typeMetadata.DeclaringType);
                }
            }

            if (typeMetadata.Methods != null)
            {
                List <MethodMetadata> methods = new List <MethodMetadata>();
                foreach (BaseMethodMetadata methodMetadata in typeMetadata.Methods)
                {
                    MethodMetadata metadata = new MethodMetadata(methodMetadata);
                    methods.Add(metadata);
                }
                m_Methods = methods;
            }

            if (typeMetadata.Constructors != null)
            {
                List <MethodMetadata> constructors = new List <MethodMetadata>();
                foreach (BaseMethodMetadata baseMetadata in typeMetadata.Constructors)
                {
                    MethodMetadata methodMetadata = new MethodMetadata(baseMetadata);
                    constructors.Add(methodMetadata);
                }
                m_Constructors = constructors;
            }

            m_TypeKind = typeMetadata.TypeKind;
        }
Пример #16
0
        public BaseTypeMetadata MapUp()
        {
            BaseTypeMetadata TypeMetadataDTO = new BaseTypeMetadata();

            TypeMetadataDTO.TypeName      = m_typeName;
            TypeMetadataDTO.NamespaceName = m_NamespaceName;

            if (!BaseTypeMetadata.TypeDictionary.ContainsKey(this.m_typeName))
            {
                BaseTypeMetadata.TypeDictionary.Add(this.m_typeName, TypeMetadataDTO);
            }

            if (m_BaseType != null)
            {
                if (BaseTypeMetadata.TypeDictionary.ContainsKey(m_BaseType.m_typeName))
                {
                    TypeMetadataDTO.BaseType = BaseTypeMetadata.TypeDictionary[m_BaseType.m_typeName];
                }
                else
                {
                    TypeMetadataDTO.BaseType = m_BaseType.MapUp();
                }
            }

            if (m_GenericArguments != null)
            {
                List <BaseTypeMetadata> GenericArgumentsDTO = new List <BaseTypeMetadata>();
                foreach (TypeMetadata metadata in m_GenericArguments)
                {
                    BaseTypeMetadata baseTypeMetadata;
                    if (BaseTypeMetadata.TypeDictionary.ContainsKey(metadata.m_typeName))
                    {
                        baseTypeMetadata = BaseTypeMetadata.TypeDictionary[metadata.m_typeName];
                    }
                    else
                    {
                        baseTypeMetadata = metadata.MapUp();
                    }
                    GenericArgumentsDTO.Add(baseTypeMetadata);
                }
                TypeMetadataDTO.GenericArguments = GenericArgumentsDTO;
            }

            //TypeMetadataDTO.Modifiers = new Tuple<AccessLevel, SealedEnum, AbstractEnum>(m_Modifiers.Item1, m_Modifiers.Item2, m_Modifiers.Item3);

            if (m_ImplementedInterfaces != null)
            {
                List <BaseTypeMetadata> ImplementedInterfacesDTO = new List <BaseTypeMetadata>();
                foreach (TypeMetadata metadata in m_ImplementedInterfaces)
                {
                    BaseTypeMetadata baseTypeMetadata;
                    if (BaseTypeMetadata.TypeDictionary.ContainsKey(metadata.m_typeName))
                    {
                        baseTypeMetadata = BaseTypeMetadata.TypeDictionary[metadata.m_typeName];
                    }
                    else
                    {
                        baseTypeMetadata = metadata.MapUp();
                    }
                    ImplementedInterfacesDTO.Add(baseTypeMetadata);
                }
                TypeMetadataDTO.ImplementedInterfaces = ImplementedInterfacesDTO;
            }

            if (m_NestedTypes != null)
            {
                List <BaseTypeMetadata> NestedTypeDTO = new List <BaseTypeMetadata>();
                foreach (TypeMetadata metadata in m_NestedTypes)
                {
                    BaseTypeMetadata baseTypeMetadata;
                    if (BaseTypeMetadata.TypeDictionary.ContainsKey(metadata.m_typeName))
                    {
                        baseTypeMetadata = BaseTypeMetadata.TypeDictionary[metadata.m_typeName];
                    }
                    else
                    {
                        baseTypeMetadata = metadata.MapUp();
                    }
                    NestedTypeDTO.Add(baseTypeMetadata);
                }
                TypeMetadataDTO.NestedTypes = NestedTypeDTO;
            }
            if (m_Properties != null)
            {
                List <BasePropertyMetadata> PropertiesDTO = new List <BasePropertyMetadata>();
                foreach (PropertyMetadata metadata in m_Properties)
                {
                    BasePropertyMetadata propertyMetadata = metadata.MapUp();
                    PropertiesDTO.Add(propertyMetadata);
                }
                TypeMetadataDTO.Properties = PropertiesDTO;
            }

            if (m_DeclaringType != null)
            {
                if (BaseTypeMetadata.TypeDictionary.ContainsKey(m_DeclaringType.m_typeName))
                {
                    TypeMetadataDTO.DeclaringType = BaseTypeMetadata.TypeDictionary[m_DeclaringType.m_typeName];
                }
                else
                {
                    TypeMetadataDTO.DeclaringType = m_DeclaringType.MapUp();
                }
            }

            if (m_Methods != null)
            {
                List <BaseMethodMetadata> MethodMetadataDTO = new List <BaseMethodMetadata>();
                foreach (MethodMetadata metadata in m_Methods)
                {
                    BaseMethodMetadata methodMetadata = metadata.MapUp();
                    MethodMetadataDTO.Add(methodMetadata);
                }
                TypeMetadataDTO.Methods = MethodMetadataDTO;
            }
            if (m_Constructors != null)
            {
                List <BaseMethodMetadata> ConstructorsDTO = new List <BaseMethodMetadata>();
                foreach (MethodMetadata metadata in m_Methods)
                {
                    BaseMethodMetadata methodMetadata = metadata.MapUp();
                    ConstructorsDTO.Add(methodMetadata);
                }
                TypeMetadataDTO.Constructors = ConstructorsDTO;
            }
            if (!BaseTypeMetadata.TypeDictionary.ContainsKey(TypeMetadataDTO.TypeName))
            {
                BaseTypeMetadata.TypeDictionary.Add(TypeMetadataDTO.TypeName, TypeMetadataDTO);
            }
            TypeMetadataDTO.TypeKind = m_TypeKind;
            return(TypeMetadataDTO);
        }