Item ItemBuilder(Type template_type, object data_source) { var data = new List <Data>(DataBuilder.GetDatasFor(template_type, data_source)); var embedded_type_infos = TemplateType.get_public_writable_instance_properties().Where(x => x.PropertyType.Namespace == "System.Collections.Generic"); var embedded_collection = new List <EmbeddedCollection>(); foreach (var embedded_type_info in embedded_type_infos) { var property_name = embedded_type_info.Name; var property_value = data_source.try_get_property_value(property_name); var embedded_items = new List <Item>(); foreach (var element in (IEnumerable)property_value) { var embedded_item = new Item(); embedded_item.data = DataBuilder.GetDatasFor(element.GetType(), element); embedded_item.links = CreateLinks(element); embedded_items.Add(embedded_item); } embedded_collection.Add(new EmbeddedCollection { name = property_name, items = embedded_items }); } var item = new Item { data = data, links = new List <Link>(), embedded = embedded_collection }; return(item); }