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