Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }