Open.Core.DynamicXml.TryGetMember C# (CSharp) Method

TryGetMember() public method

public TryGetMember ( GetMemberBinder binder, object &result ) : bool
binder System.Dynamic.GetMemberBinder
result object
return bool
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            // Setup initial conditions.
            result = null;

            // Handle the Value and Count special cases.
            switch (binder.Name)
            {
                case Value:
                    result = xmlElements[0].Value;
                    break;

                case Count:
                    result = xmlElements.Count;
                    break;

                default:
                    {
                        // Try to find a named attribute first.
                        var attr = xmlElements[0].Attribute(XName.Get(binder.Name));
                        if (attr != null)
                        {
                            // If a named attribute was found, return that NON-dynamic object.
                            result = attr;
                        }
                        else
                        {
                            // Find the named descendants.
                            var items = xmlElements.Descendants(XName.Get(binder.Name));
                            if (items != null && items.Count() > 0)
                            {
                                // Prepare a new dynamic object with the list of found descendants.
                                result = new DynamicXml(items);
                            }
                        }
                    }
                    break;
            }

            if (result == null)
            {
                // Element not found, create a new element here.
                xmlElements[0].AddFirst(new XElement(binder.Name));
                result = new DynamicXml(xmlElements[0].Descendants().First());
            }

            // Finish up.
            return true;
        }