5 // John Donagher (john@webmeta.com)
7 // (C) 2002 John Donagher
10 using System.Reflection;
12 using System.ComponentModel;
\r
13 using System.Collections;
\r
15 namespace System.Xml.Serialization
\r
18 /// Summary description for XmlAttributes.
\r
20 public class XmlAttributes
\r
22 private XmlAnyAttributeAttribute xmlAnyAttribute;
\r
23 private XmlAnyElementAttributes xmlAnyElements;
\r
24 private XmlArrayAttribute xmlArray;
\r
25 private XmlArrayItemAttributes xmlArrayItems;
\r
26 private XmlAttributeAttribute xmlAttribute;
\r
27 private XmlChoiceIdentifierAttribute xmlChoiceIdentifier;
\r
28 private object xmlDefaultValue;
\r
29 private XmlElementAttributes xmlElements;
\r
30 private XmlEnumAttribute xmlEnum;
\r
31 private bool xmlIgnore;
\r
33 private XmlRootAttribute xmlRoot;
\r
34 private XmlTextAttribute xmlText;
\r
35 private XmlTypeAttribute xmlType;
\r
37 private MemberInfo minfo;
\r
38 private FieldInfo finfo;
\r
39 private PropertyInfo pinfo;
\r
40 internal ArrayList XmlIncludes;
\r
41 //internal string ElementName;
\r
43 //The element Order in serialization.
\r
45 internal bool isAttribute;
\r
46 internal static XmlAttributes.XmlAttributesComparer attrComparer;
\r
48 //Sorting Order of Elements: XmlNs, XmlAttributes, XmlElement
\r
49 internal class XmlAttributesComparer : IComparer
\r
51 public int Compare(object x,object y)
\r
53 if(x is XmlAttributes && y is XmlAttributes)
\r
55 XmlAttributes attx = (XmlAttributes)x;
\r
56 XmlAttributes atty = (XmlAttributes)y;
\r
61 if(attx.isAttribute)
\r
63 if(atty.isAttribute)
\r
65 int diff = attx.order - atty.order;
\r
77 throw new Exception("Should never occur. XmlAttributesComparer.Compare");
\r
81 public XmlAttributes ()
\r
83 xmlAnyElements = new XmlAnyElementAttributes ();
\r
84 xmlArrayItems = new XmlArrayItemAttributes ();
\r
85 xmlElements = new XmlElementAttributes ();
\r
86 XmlIncludes = new ArrayList();
\r
89 static XmlAttributes ()
\r
91 attrComparer = new XmlAttributes.XmlAttributesComparer();
\r
94 public XmlAttributes (ICustomAttributeProvider provider)
\r
96 object[] attributes = provider.GetCustomAttributes(false);
\r
97 foreach(object obj in attributes)
\r
99 if(obj is XmlAnyAttributeAttribute)
\r
100 xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
\r
101 else if(obj is XmlAnyElementAttribute)
\r
102 xmlAnyElements.Add((XmlAnyElementAttribute) obj);
\r
103 else if(obj is XmlArrayAttribute)
\r
104 xmlArray = (XmlArrayAttribute) obj;
\r
105 else if(obj is XmlArrayItemAttribute)
\r
106 xmlArrayItems.Add((XmlArrayItemAttribute) obj);
\r
107 else if(obj is XmlAttributeAttribute)
\r
108 xmlAttribute = (XmlAttributeAttribute) obj;
\r
109 else if(obj is XmlChoiceIdentifierAttribute)
\r
110 xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
\r
111 else if(obj is DefaultValueAttribute)
\r
112 xmlDefaultValue = obj;
\r
113 else if(obj is XmlElementAttribute )
\r
114 xmlElements.Add((XmlElementAttribute ) obj);
\r
115 else if(obj is XmlEnumAttribute)
\r
116 xmlEnum = (XmlEnumAttribute) obj;
\r
117 else if(obj is XmlIgnoreAttribute)
\r
119 else if(obj is XmlNamespaceDeclarationsAttribute)
\r
121 else if(obj is XmlRootAttribute)
\r
122 xmlRoot = (XmlRootAttribute) obj;
\r
123 else if(obj is XmlTextAttribute)
\r
124 xmlText = (XmlTextAttribute) obj;
\r
125 else if(obj is XmlTypeAttribute)
\r
126 xmlType = (XmlTypeAttribute) obj;
\r
130 #region public properties
\r
131 public XmlAnyAttributeAttribute XmlAnyAttribute
\r
135 return xmlAnyAttribute;
139 xmlAnyAttribute = value;
142 public XmlAnyElementAttributes XmlAnyElements
\r
146 return xmlAnyElements;
149 public XmlArrayAttribute XmlArray
\r
160 public XmlArrayItemAttributes XmlArrayItems
\r
164 return xmlArrayItems;
167 public XmlAttributeAttribute XmlAttribute
\r
175 xmlAttribute = value;
178 public XmlChoiceIdentifierAttribute XmlChoiceIdentifier
\r
182 return xmlChoiceIdentifier;
186 xmlChoiceIdentifier = value;
189 public object XmlDefaultValue
\r
193 return xmlDefaultValue;
197 xmlDefaultValue = value;
200 public XmlElementAttributes XmlElements
\r
207 public XmlEnumAttribute XmlEnum
\r
218 public bool XmlIgnore
\r
240 public XmlRootAttribute XmlRoot
\r
250 public XmlTextAttribute XmlText
\r
261 public XmlTypeAttribute XmlType
\r
274 #region internal properties
\r
275 internal MemberInfo MemberInfo
\r
277 get { return minfo; }
\r
278 set { minfo = value; }
\r
281 internal FieldInfo FieldInfo
\r
283 get { return finfo; }
\r
284 set { finfo = value; }
\r
287 internal PropertyInfo PropertyInfo
\r
289 get { return pinfo; }
\r
290 set { pinfo = value; }
\r
294 //Only permissible attributes for a class type are: XmlRoot and XmlInclude
\r
295 internal static XmlAttributes FromClass(Type classType)
\r
297 XmlAttributes XmlAttr = new XmlAttributes();
\r
298 object[] attributes = classType.GetCustomAttributes(false);
\r
299 foreach(object obj in attributes)
\r
301 if(obj is XmlRootAttribute)
\r
302 XmlAttr.xmlRoot = (XmlRootAttribute) obj;
\r
303 else if(obj is XmlIncludeAttribute)
\r
304 XmlAttr.XmlIncludes.Add(obj);
\r
309 internal static XmlAttributes FromField(MemberInfo member, FieldInfo finfo)
\r
311 XmlAttributes XmlAttr = new XmlAttributes();
\r
312 object[] attributes = member.GetCustomAttributes(false);
\r
313 XmlAttr.AddMemberAttributes(attributes);
\r
315 XmlAttr.minfo = member;
\r
316 XmlAttr.finfo = finfo;
\r
322 internal static XmlAttributes FromProperty(MemberInfo member, PropertyInfo pinfo)
\r
325 XmlAttributes XmlAttr = new XmlAttributes();
\r
326 object[] attributes = member.GetCustomAttributes(false);
\r
327 XmlAttr.AddMemberAttributes(attributes);
\r
329 XmlAttr.minfo = member;
\r
330 XmlAttr.pinfo = pinfo;
\r
334 internal void AddMemberAttributes(object[] attributes)
\r
336 foreach(object obj in attributes)
\r
338 if(obj is XmlAnyAttributeAttribute)
\r
340 xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
\r
341 isAttribute = true;
\r
343 else if(obj is XmlAttributeAttribute)
\r
345 xmlAttribute = (XmlAttributeAttribute) obj;
\r
346 isAttribute = true;
\r
348 else if(obj is XmlNamespaceDeclarationsAttribute)
\r
351 isAttribute = true;
\r
353 else if(obj is XmlAnyElementAttribute)
\r
355 xmlAnyElements.Add((XmlAnyElementAttribute) obj);
\r
356 order = ((XmlAnyElementAttribute) obj).Order;
\r
358 else if(obj is XmlArrayAttribute)
\r
360 xmlArray = (XmlArrayAttribute) obj;
\r
361 order = ((XmlArrayAttribute) obj).Order;
\r
363 else if(obj is XmlArrayItemAttribute)
\r
365 xmlArrayItems.Add((XmlArrayItemAttribute) obj);
\r
366 order = ((XmlArrayItemAttribute) obj).Order;
\r
368 else if(obj is XmlChoiceIdentifierAttribute)
\r
370 xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
\r
371 order = ((XmlChoiceIdentifierAttribute) obj).Order;
\r
373 else if(obj is XmlTextAttribute)
\r
375 xmlText = (XmlTextAttribute) obj;
\r
376 order = ((XmlTextAttribute) obj).Order;
\r
378 else if(obj is XmlElementAttribute )
\r
380 xmlElements.Add((XmlElementAttribute ) obj);
\r
381 order = ((XmlElementAttribute ) obj).Order;
\r
383 else if(obj is DefaultValueAttribute)
\r
385 xmlDefaultValue = ((DefaultValueAttribute ) obj).Value;
\r
387 else if(obj is XmlEnumAttribute)
\r
389 xmlEnum = (XmlEnumAttribute) obj;
\r
391 else if(obj is XmlIgnoreAttribute)
\r
395 else if(obj is XmlRootAttribute)
\r
397 throw new Exception("should never happen. XmlRoot on a member");
\r
399 else if(obj is XmlTypeAttribute)
\r
401 xmlType = (XmlTypeAttribute) obj;
\r
406 internal string GetAttributeName(Type type, string defaultName)
\r
408 if(XmlAttribute != null && XmlAttribute.AttributeName != null && XmlAttribute.AttributeName != "")
\r
409 return XmlAttribute.AttributeName;
\r
410 return defaultName;
\r
413 internal string GetElementName(Type type, string defaultName)
\r
415 foreach(XmlElementAttribute elem in XmlElements)
\r
417 if(elem.Type == type && elem.ElementName != null && elem.ElementName != "")
\r
418 return elem.ElementName;
\r
419 else if(elem.Type == null && elem.ElementName != null && elem.ElementName != "")
\r
420 return elem.ElementName;
\r
422 return defaultName;
\r
425 internal string GetAttributeNamespace(Type type)
\r
427 if(XmlAttribute != null)
\r
428 return XmlAttribute.Namespace;
\r
431 internal string GetElementNamespace(Type type)
\r
433 foreach(XmlElementAttribute elem in XmlElements)
\r
435 if(elem.Type == type )
\r
436 return elem.Namespace;
\r
437 else if(elem.Type == null)
\r
438 return elem.Namespace;
\r