using System;
using System.Collections.Generic;
+using System.Linq;
using System.Xml;
namespace System.Xml.Linq
public object Annotation (Type type)
{
- if (annotations != null)
- foreach (object o in annotations)
- if (o.GetType () == type)
- return o;
- throw new ArgumentException ();
+ return Annotations (type).FirstOrDefault ();
}
public IEnumerable<T> Annotations<T> () where T : class
public IEnumerable<object> Annotations (Type type)
{
+ if (type == null)
+ throw new ArgumentNullException ("type");
if (annotations == null)
yield break;
foreach (object o in annotations)
- if (o.GetType () == type)
+ if (type.IsAssignableFrom (o.GetType ()))
yield return o;
}
if (annotations == null)
return;
for (int i = 0; i < annotations.Count; i++)
- if (annotations [i].GetType () == type)
+ if (type.IsAssignableFrom (annotations [i].GetType ()))
annotations.RemoveAt (i);
}
- [MonoTODO]
- int IXmlLineInfo.LineNumber {
+ internal int LineNumber {
get { return line; }
+ set { line = value; }
}
- [MonoTODO]
- int IXmlLineInfo.LinePosition {
+ internal int LinePosition {
get { return column; }
+ set { column = value; }
+ }
+
+ int IXmlLineInfo.LineNumber {
+ get { return LineNumber; }
+ }
+
+ int IXmlLineInfo.LinePosition {
+ get { return LinePosition; }
}
- [MonoTODO]
bool IXmlLineInfo.HasLineInfo ()
{
return line > 0;
}
+
+ internal void FillLineInfoAndBaseUri (XmlReader r, LoadOptions options)
+ {
+ if ((options & LoadOptions.SetLineInfo) != LoadOptions.None) {
+ IXmlLineInfo li = r as IXmlLineInfo;
+ if (li != null && li.HasLineInfo ()) {
+ LineNumber = li.LineNumber;
+ LinePosition = li.LinePosition;
+ }
+ }
+ if ((options & LoadOptions.SetBaseUri) != LoadOptions.None)
+ BaseUri = r.BaseURI;
+ }
+
+ internal void OnAddingObject (object addedObject)
+ {
+ OnChanging (addedObject, XObjectChangeEventArgs.Add);
+ }
+
+ internal void OnAddedObject (object addedObject)
+ {
+ OnChanged (addedObject, XObjectChangeEventArgs.Add);
+ }
+
+ internal void OnNameChanging (object renamedObject)
+ {
+ OnChanging (renamedObject, XObjectChangeEventArgs.Name);
+ }
+
+ internal void OnNameChanged (object renamedObject)
+ {
+ OnChanged (renamedObject, XObjectChangeEventArgs.Name);
+ }
+
+ internal void OnRemovingObject (object removedObject)
+ {
+ OnChanging (removedObject, XObjectChangeEventArgs.Remove);
+ }
+
+ internal void OnRemovedObject (object removedObject)
+ {
+ OnChanged (removedObject, XObjectChangeEventArgs.Remove);
+ }
+
+ internal void OnValueChanging (object changedObject)
+ {
+ OnChanging (changedObject, XObjectChangeEventArgs.Value);
+ }
+
+ internal void OnValueChanged (object changedObject)
+ {
+ OnChanged (changedObject, XObjectChangeEventArgs.Value);
+ }
+
+
+ void OnChanging (object sender, XObjectChangeEventArgs args)
+ {
+ if (Changing != null)
+ Changing (sender, args);
+ if (Owner != null)
+ Owner.OnChanging (sender, args);
+ }
+
+ void OnChanged (object sender, XObjectChangeEventArgs args)
+ {
+ if (Changed != null)
+ Changed (sender, args);
+ if (Owner != null)
+ Owner.OnChanged (sender, args);
+ }
}
}