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