示例#1
0
        public TypeMetadata Extract(Type type, AssemblyMetadata rootAssembly)
        {
            var typeData = new TypeMetadata(type.GetHashCode());

            if (!rootAssembly.RegisteredTypes.Any(metadata => metadata.TypeHash == typeData.GetHashCode()))
            {
                rootAssembly.RegisteredTypes.Add(typeData);
            }

            typeData.TypeName      = type.Name;
            typeData.DeclaringType = EmitDeclaringType(type.DeclaringType, rootAssembly);
            typeData.Constructors  = type.GetConstructors()
                                     .Select(info => _methodMetadataExtractor.Extract(info, rootAssembly, this)).ToList();
            typeData.Methods = type.GetMethods().Where(info => !info.IsSpecialName)
                               .Select(info => _methodMetadataExtractor.Extract(info, rootAssembly, this))
                               .ToList();
            typeData.NestedTypes           = EmitNestedTypes(type.GetNestedTypes(), rootAssembly);
            typeData.ImplementedInterfaces = EmitImplements(type.GetInterfaces(), rootAssembly).ToList();
            typeData.GenericArguments      =
                !type.IsGenericTypeDefinition
                    ? null
                    : EmitGenericArguments(type.GetGenericArguments(), rootAssembly).ToList();
            typeData.Modifiers  = EmitModifiers(type);
            typeData.BaseType   = EmitExtends(type, rootAssembly);
            typeData.Properties = EmitProperties(type.GetProperties(), rootAssembly).ToList();
            typeData.TypeKind   = GetTypeKind(type);
            typeData.Attributes = EmitAttributes(type, rootAssembly).ToList();
            typeData.EnumFields = EmitEnumFields(type).ToList();
            typeData.Fields     = EmitFields(type, rootAssembly).ToList();


            typeData.RootAssembly = rootAssembly;

            return(typeData);
        }