/// <summary> /// Handler for fetching dynamic members. In this case, fetching elements. /// No matter what, a <see cref="DynamicXElement"/> is returned. /// </summary> /// <param name="binder"></param> /// <param name="result"></param> /// <returns>DynamicXElement</returns> public override bool TryGetMember(GetMemberBinder binder, out object result) { if (ActualElement == null) { result = new DynamicXElement(); return(true); } var elements = GetElements(ActualElement, binder.Name).ToArray(); var elementCount = elements.Count(); if (elementCount == 0) { result = new DynamicXElement(); return(true); } if (elementCount == 1) { var e = elements.First(); result = e.HasElements || e.HasAttributes ? new DynamicXElement(e) : (object)e.Value; return(true); } result = elements.Select(e => new DynamicXElement(e)); return(true); }
/// <summary> /// Handler for fetching indexes. This is implemented to fetch an element whose attribute /// with name <see cref="IndexAttribute"/> matches this index value. /// </summary> /// <param name="binder"></param> /// <param name="indexes"></param> /// <param name="result"></param> /// <returns>String</returns> /// <example>A list of elements called "items" with each "item" attribute having an attribute "id" /// could be fetched like: Items["email"] to fetch an item with @id="email"</example> public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { if (ActualElement == null) { result = null; return(true); } var requestedName = indexes[0] as string; var element = ActualElement .Elements() .Where(n => n.HasAttributes) .Where(n => n.Attribute(IndexAttribute) != null) .Where(n => NameMatch(requestedName, n.Attribute(IndexAttribute).Value)) .ToArray(); if (element.Length == 0) { result = new DynamicXElement(); return(true); } if (element.Length == 1) { result = new DynamicXElement(element.First()); return(true); } result = null; return(false); }