/// <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); }
/// <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)); } }