public void Visit(ListProperty property) { var createList = CodeDom.AssignField(CodeDom.GetFieldName(property.Name), CodeDom.New(property.TypeName)); this.constructor.Statements.Add(createList); CodeExpression element = CodeDom.VarRef("element"); CodeVariableDeclarationStatement localVar = null; CodeExpression elements; if(!property.NoListNode) { element = element.Invoke("Element", CodeDom.Primitive(property.ElementName)); localVar = CodeDom.DeclareVariable<XElement>(element, property.ElementName); } var enumerableElements = (localVar != null ? CodeDom.VarRef(localVar) : element).Invoke("Elements", CodeDom.Primitive(property.ItemElementName)); var foreachStatements = CodeDom.ForEach<XElement>(enumerableElements, current => new CodeStatement[] { new CodeExpressionStatement(CodeDom.FieldInvoke(CodeDom.GetFieldName(property.Name), "Add", CodeDom.New(property.Type.Name, current))) }); if(localVar != null) { this.constructor.Statements.Add(localVar); this.constructor.Statements.Add(CodeDom.If(CodeDom.VarRef(localVar).IsNotNull(), foreachStatements)); } else this.constructor.Statements.AddRange(foreachStatements); }
void LoadProperty(Class @class, XElement elem, string propertyName) { Class propertyType; var typeAttr = elem.Attribute("type"); var listAttr = elem.Attribute("list"); bool noListNode = elem.Attribute("no_list_node") != null; bool isDefined = elem.Attribute("defined") != null; bool isList = listAttr != null; Property property; if(isList) { propertyType = isDefined ? this.classes[listAttr.Value] : LoadClass(elem, listAttr.Value); property = new ListProperty(AttributeValueOrDefault(elem, "name"), propertyName, propertyType, listAttr.Value, noListNode); } else { if(typeAttr != null) propertyType = GetType(typeAttr); else propertyType = isDefined ? this.classes[elem.Name.LocalName] : LoadClass(elem); property = new Property(AttributeValueOrDefault(elem, "name"), propertyName, propertyType); } @class.Properties.Add(property); }