예제 #1
0
        /// <summary>
        ///     Provides the implementation for operations that invoke a member. Classes derived from the
        ///     <see cref="T:System.Dynamic.DynamicObject" /> class can override this method to specify dynamic behavior for
        ///     operations such as calling a method.
        /// </summary>
        /// <param name="binder">
        ///     Provides information about the dynamic operation. The binder.Name property provides the name of
        ///     the member on which the dynamic operation is performed. For example, for the statement
        ///     sampleObject.SampleMethod(100), where sampleObject is an instance of the class derived from the
        ///     <see cref="T:System.Dynamic.DynamicObject" /> class, binder.Name returns "SampleMethod". The binder.IgnoreCase
        ///     property specifies whether the member name is case-sensitive.
        /// </param>
        /// <param name="args">
        ///     The arguments that are passed to the object member during the invoke operation. For example, for the
        ///     statement sampleObject.SampleMethod(100), where sampleObject is derived from the
        ///     <see cref="T:System.Dynamic.DynamicObject" /> class, <paramref name="args[0]" /> is equal to 100.
        /// </param>
        /// <param name="result">The result of the member invocation.</param>
        /// <returns>
        ///     true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the
        ///     language determines the behavior. (In most cases, a language-specific run-time exception is thrown.)
        /// </returns>
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (binder.Name != "SelectAll")
            {
                return(base.TryInvokeMember(binder, args, out result));
            }

            result = new DynamicXmlNodeList(_Xml.Elements());

            return(true);
        }
예제 #2
0
        /// <summary>
        ///     Provides the implementation for operations that get member values. Classes derived from the
        ///     <see cref="T:System.Dynamic.DynamicObject" /> class can override this method to specify dynamic behavior for
        ///     operations such as getting a value for a property.
        /// </summary>
        /// <param name="binder">
        ///     Provides information about the object that called the dynamic operation. The binder.Name property
        ///     provides the name of the member on which the dynamic operation is performed. For example, for the
        ///     Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived
        ///     from the <see cref="T:System.Dynamic.DynamicObject" /> class, binder.Name returns "SampleProperty". The
        ///     binder.IgnoreCase property specifies whether the member name is case-sensitive.
        /// </param>
        /// <param name="result">
        ///     The result of the get operation. For example, if the method is called for a property, you can
        ///     assign the property value to <paramref name="result" />.
        /// </param>
        /// <returns>
        ///     true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the
        ///     language determines the behavior. (In most cases, a run-time exception is thrown.)
        /// </returns>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            string name = binder.Name;

            switch (name)
            {
            case "Name":
                result = _Xml.Name.LocalName;
                return(true);

            case "Value":
                result = _Xml.Value;
                return(true);

            case "Elements":

                result = new DynamicXmlNodeList(_Xml.Elements());
                return(true);

            case "Parent":

                result = new DynamicXmlNode(_Xml.Parent);
                return(true);

            default:

                XAttribute xattribute = _Xml.Attribute(name);
                if (xattribute != null)
                {
                    result = xattribute.Value;
                    return(true);
                }

                XElement xelement = _Xml.Element(name);
                if (xelement != null)
                {
                    result = xelement.Value;
                    return(true);
                }

                foreach (XElement element in _Xml.Elements())
                {
                    if (MakePluralName(element.Name.LocalName) == name)
                    {
                        result = new DynamicXmlNodeList(_Xml.Elements(element.Name));
                        return(true);
                    }
                }

                return(base.TryGetMember(binder, out result));
            }
        }