コード例 #1
0
 void LoadAttributes(XElement element, Class @class)
 {
     foreach(XElement elem in element.Elements()) {
         var typeAttr = elem.Attribute("type");
         string elemName = elem.Name.LocalName;
         AttributeProperty property = new AttributeProperty(AttributeValueOrDefault(elem, "name"), elemName, GetType(typeAttr));
         @class.Properties.Add(property);
     }
 }
コード例 #2
0
 Class LoadClass(XElement element, string name)
 {
     Class @class;
     if(this.classes.TryGetValue(name, out @class))
         return @class;
     @class = new Class(AttributeValueOrDefault(element, "typename") ?? name.Capitalize(), AttributeValueOrDefault(element, "namespace") ?? DefaultNamespace);
     foreach(XElement elem in element.Elements()) {
         string propertyName = elem.Name.LocalName;
         if(propertyName == name + ".attributes")
             LoadAttributes(elem, @class);
         else if(propertyName == name + ".definitions")
             LoadDefinitions(elem);
         else
             LoadProperty(@class, elem, propertyName);
     }
     this.classes.Add(name, @class);
     return @class;
 }
コード例 #3
0
 CodeExpression GetSystemTypeInitializer(Class type, CodeExpression value)
 {
     if(type == Class.String) return value.Invoke("Trim");
     return CodeDom.TypeRef(type.Name).Invoke("Parse", value);
 }
コード例 #4
0
 static void GenerateClass(CodeNamespace ns, Class @class)
 {
     CodeTypeDeclaration type = CodeDom.CreateClass(@class.Name);
     CodeConstructor constructor = CodeDom.CreateConstructor(@public: [email protected]);
     constructor.AddParameter<XElement>("element");
     PropertyInitializerVisitor visitor = new PropertyInitializerVisitor(constructor);
     foreach(Property property in @class.Properties) {
         type.AddProperty(property.TypeName, property.Name);
         property.Accept(visitor);
     }
     type.Members.Add(constructor);
     if(@class.IsRootType) {
         type.Members.AddRange(new CodeTypeMember[] {
             CreateReadFromStringMethod(type),
             CreateReadFromStreamMethod(type),
             CreateReadFromFileMethod(type)
         });
     }
     ns.Types.Add(type);
 }
コード例 #5
0
 public AttributeProperty(string name, string attributeName, Class type)
     : base(name, attributeName, type)
 {
 }
コード例 #6
0
 public Property(string name, string elementName, Class type)
 {
     this.name = name ?? elementName.Capitalize();
     this.type = type;
     this.elementName = elementName;
 }
コード例 #7
0
 public ListProperty(string name, string elementName, Class type, string itemElementName, bool noListNode)
     : base(name, elementName, type)
 {
     this.itemElementName = itemElementName;
     this.noListNode = noListNode;
 }
コード例 #8
0
 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);
 }