public void ShouldGenerateReferencedTypes() { var elTypeDef = TypeGenerator.MakeTypeDef("TElement", new Dictionary <string, Type> { { "StringProp", typeof(String) }, }); var pointTypeDef = TypeGenerator.MakeTypeDef("TPoint", new Dictionary <string, Type> { { "X", typeof(double) }, { "Y", typeof(double) } }); var objTypeDef = TypeGenerator.MakeTypeDef("TRoot", new Dictionary <string, Type> { { "ListProp", TypeGenerator.MakeListDef(elTypeDef) }, { "Center", pointTypeDef }, { "Parent", TypeGenerator.MakeTypeRef("TRoot") }, { "Nodes", TypeGenerator.MakeListDef(TypeGenerator.MakeTypeRef("TRoot")) } }); IObjectFactory objFactory = objTypeDef.MakeObjectFactory(); IObjectFactory elFactory = elTypeDef.MakeObjectFactory(); IObjectFactory pointFactory = pointTypeDef.MakeObjectFactory(); var list = elFactory.NewList(); list.Add(elFactory.NewObject()); list.Add(elFactory.NewObject()); var obj = objFactory.NewObjectAccessor(); obj.SetValue("ListProp", list); foreach (var el in obj.GetValue <IEnumerable <IObjectAccessor> >("ListProp")) { Assert.That(el.GetType().Name, Is.EqualTo("TElement")); el[0] = "test"; } var st = pointFactory.NewObjectAccessor(); st.SetValue("X", 10.5); st.SetValue("Y", 48.96); obj.SetValue("Center", st); var parent = objFactory.NewObjectAccessor(); obj.SetValue("Parent", parent); var nodes = objFactory.NewList(); nodes.Add(obj); parent.SetValue("Nodes", nodes); }