Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Dynamic;
- using System.Reflection;
- using System.Xml.Linq;
- namespace Core.Dynamic {
- /*
- //Example
- using System;
- using Core.Dynamic;
- namespace ConsoleApplication1 {
- class Program {
- static void Main(string[] args) {
- dynamic contact = new DynamicXMLNode("Contacts");
- contact.Name = "Patrick Jones";
- contact.Phone = "202-555-0487";
- contact.Address = new DynamicXMLNode();
- contact.Address.Street = "123 Main St";
- contact.Address.City = "Houston";
- contact.Address.State = "TX";
- contact.Address.Postal = "77001";
- Console.WriteLine(contact);
- }
- }
- }
- */
- public class DynamicXMLNode:DynamicObject {
- public static XElement ToXml(DynamicXMLNode dnode) {
- return dnode.node;
- }
- readonly XElement node;
- public DynamicXMLNode() { }
- public DynamicXMLNode(XElement node) {
- this.node = node;
- }
- public DynamicXMLNode(String name) {
- node = new XElement(name);
- }
- public override string ToString() {
- return node.ToString(SaveOptions.None);
- }
- public override bool TryConvert(ConvertBinder binder,out object result) {
- if(binder.Type == typeof(String)) {
- result = node.Value;
- return true;
- }
- else {
- result = node;
- return true;
- }
- }
- public override bool TryInvokeMember(InvokeMemberBinder binder,
- object[] args,
- out object result) {
- Type xmlType = typeof(XElement);
- try {
- result = xmlType.InvokeMember(
- binder.Name,
- BindingFlags.InvokeMethod |
- BindingFlags.Public |
- BindingFlags.Instance,
- null,node,args);
- return true;
- }
- catch {
- result = null;
- return false;
- }
- }
- public override bool TrySetMember(
- SetMemberBinder binder,object value) {
- XElement setNode = node.Element(binder.Name);
- if(setNode != null)
- setNode.SetValue(value);
- else {
- if(value.GetType() == typeof(DynamicXMLNode))
- node.Add(new XElement(binder.Name));
- else
- node.Add(new XElement(binder.Name,value));
- }
- return true;
- }
- public override bool TryGetMember(
- GetMemberBinder binder,out object result) {
- XElement getNode = node.Element(binder.Name);
- if(getNode != null) {
- result = new DynamicXMLNode(getNode);
- return true;
- }
- else {
- result = null;
- return false;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment