// This is the only way we create XML tags (except for Endpoints) public XmlNode CreateNode(MetaDataCustomAttribute data, TokenDefinition rule) { XmlNode node = AddElement(null, rule.xmlTagName); // make an attribute for each constructor argument if (data.FixedArgs.Length != 0) { for (int i = 0; i < data.FixedArgs.Length; i++) { string name = rule.constructorFields[i]; if (data.FixedArgs[i] == null) { AddAttribute(node, name, ""); } else { string value = data.FixedArgs[i].ToString(); AddAttribute(node, name, value); } } } // make an attribute for each constructor-time property for (int i = 0; i < data.NamedArgs.Length; i++) { string name = rule.FindPropertyReplacement(data.NamedArgs[i].Name); object arg = data.NamedArgs[i].Value; string value; if (arg == null) { // REVIEW: do we want "" or null here? value = null; } else { value = data.NamedArgs[i].Value.ToString(); if (arg is System.UInt32) { // We output unsigned types as 0x because they are generally // hardware-related numbers which are documented in hexadecimal. value = String.Format("0x{0:x}", arg); } } AddAttribute(node, name, value); } // make an attribute for each default field for (int i = 0; i < rule.defaultFields.Length; i += 2) { string name = rule.defaultFields[i]; AddAttribute(node, name, rule.defaultFields[i + 1]); } return(node); }