andrew4582

DynamicXMLNode

Mar 9th, 2012
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.12 KB | None | 0 0
  1. using System;
  2. using System.Dynamic;
  3. using System.Reflection;
  4. using System.Xml.Linq;
  5.  
  6. namespace Core.Dynamic {
  7.     /*
  8. //Example
  9. using System;
  10. using Core.Dynamic;
  11.  
  12. namespace ConsoleApplication1 {
  13.     class Program {
  14.         static void Main(string[] args) {
  15.              
  16.             dynamic contact = new DynamicXMLNode("Contacts");
  17.  
  18.             contact.Name = "Patrick Jones";
  19.             contact.Phone = "202-555-0487";
  20.             contact.Address = new DynamicXMLNode();
  21.             contact.Address.Street = "123 Main St";
  22.             contact.Address.City = "Houston";
  23.             contact.Address.State = "TX";
  24.             contact.Address.Postal = "77001";
  25.              
  26.             Console.WriteLine(contact);
  27.         }
  28.     }
  29. }
  30.      */
  31.     public class DynamicXMLNode:DynamicObject {
  32.  
  33.         public static XElement ToXml(DynamicXMLNode dnode) {
  34.             return dnode.node;
  35.         }
  36.  
  37.         readonly XElement node;
  38.  
  39.         public DynamicXMLNode() { }
  40.  
  41.         public DynamicXMLNode(XElement node) {
  42.             this.node = node;
  43.         }
  44.  
  45.         public DynamicXMLNode(String name) {
  46.             node = new XElement(name);
  47.         }
  48.  
  49.         public override string ToString() {
  50.             return node.ToString(SaveOptions.None);
  51.         }
  52.  
  53.         public override bool TryConvert(ConvertBinder binder,out object result) {
  54.             if(binder.Type == typeof(String)) {
  55.                 result = node.Value;
  56.                 return true;
  57.             }
  58.             else {
  59.                 result = node;
  60.                 return true;
  61.             }
  62.         }
  63.  
  64.         public override bool TryInvokeMember(InvokeMemberBinder binder,
  65.             object[] args,
  66.             out object result) {
  67.  
  68.             Type xmlType = typeof(XElement);
  69.             try {
  70.                 result = xmlType.InvokeMember(
  71.                           binder.Name,
  72.                           BindingFlags.InvokeMethod |
  73.                           BindingFlags.Public |
  74.                           BindingFlags.Instance,
  75.                           null,node,args);
  76.                 return true;
  77.             }
  78.             catch {
  79.                 result = null;
  80.                 return false;
  81.             }
  82.         }
  83.         public override bool TrySetMember(
  84.             SetMemberBinder binder,object value) {
  85.             XElement setNode = node.Element(binder.Name);
  86.             if(setNode != null)
  87.                 setNode.SetValue(value);
  88.             else {
  89.                 if(value.GetType() == typeof(DynamicXMLNode))
  90.                     node.Add(new XElement(binder.Name));
  91.                 else
  92.                     node.Add(new XElement(binder.Name,value));
  93.             }
  94.             return true;
  95.         }
  96.  
  97.         public override bool TryGetMember(
  98.             GetMemberBinder binder,out object result) {
  99.             XElement getNode = node.Element(binder.Name);
  100.             if(getNode != null) {
  101.                 result = new DynamicXMLNode(getNode);
  102.                 return true;
  103.             }
  104.             else {
  105.                 result = null;
  106.                 return false;
  107.             }
  108.         }
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment