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); }