private TypeMetadata BuildTypeMetadata(TypeInfo type, TypeCache cache)
        {
            if (cache.ContainsType(type.Name))
            {
                return(cache.GetType(type.Name));
            }

            TypeMetadata typeMetadata = null;

            if (type.IsPrimitive || type == typeof(string) || type == typeof(DateTime))
            {
                typeMetadata = new TypeMetadata(type.Name);
            }
            else if (type.IsArray)
            {
                typeMetadata = new TypeMetadata(type.Name);
            }
            else if (type.IsGenericType)
            {
                type.GenericTypeArguments.Select(parameter => BuildTypeMetadata(parameter.GetTypeInfo(), cache)).ToList();
                typeMetadata = new TypeMetadata(type.Name, BuildMemberCollection(type, cache));
            }
            else
            {
                typeMetadata = new TypeMetadata(type.Name, BuildMemberCollection(type, cache));
            }

            return(cache.SetType(typeMetadata));
        }