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;
- using System.Collections.Generic;
- namespace Core.Dynamic
- {
- /*
- //Example
- using System;
- using Core.Dynamic;
- namespace ConsoleApplication1 {
- class Program {
- static void Main(string[] args) {
- dynamic contact = new DynamicXML("Contact");
- contact.Name = "Patrick Jones";
- contact.Phone = "202-555-0487";
- contact.Address = new DynamicXML();
- contact.Address.Street = "123 Main St";
- contact.Address.City = "Houston";
- contact.Address.State = "TX";
- contact.Address.Postal = "77001";
- Console.WriteLine(contact);
- string xml = DynamicXML.ToXml(contact);
- dynamic cloned = new DynamicXML("Contact", xml);
- Console.WriteLine(cloned.Name);
- }
- }
- }
- */
- public class DynamicXML : DynamicObject
- {
- public static XElement ToNode(DynamicXML dnode)
- {
- XElement element = new XElement(dnode._name);
- foreach (var key in dnode._properties.Keys)
- {
- var value = dnode._properties[key];
- if (value is DynamicXML)
- element.Add(ToNode(value as DynamicXML));
- else
- element.Add(new XElement(key, value));
- }
- return element;
- }
- public static string ToXml(DynamicXML dnode)
- {
- return ToNode(dnode).ToString(SaveOptions.None);
- }
- readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
- string _name;
- public DynamicXML() { }
- public DynamicXML(string name)
- {
- _name = name;
- }
- public DynamicXML(string name, XElement element)
- {
- foreach (var item in element.Elements())
- {
- if (item.HasElements)
- _properties[item.Name.ToString()] = new DynamicXML(item.Name.ToString(), item);
- else
- _properties[item.Name.ToString()] = item.Value;
- }
- }
- public DynamicXML(string name, string xml)
- {
- _name = name;
- var doc = XDocument.Parse(xml);
- var element = doc.Element(name);
- foreach (var item in element.Elements())
- {
- if (item.HasElements)
- _properties[item.Name.ToString()] = new DynamicXML(item.Name.ToString(), item);
- else
- _properties[item.Name.ToString()] = item.Value;
- }
- }
- public override string ToString()
- {
- return ToNode(this).ToString(SaveOptions.None);
- }
- public override bool TrySetMember(SetMemberBinder binder, object value)
- {
- if (value.GetType() == typeof(DynamicXML))
- {
- var dnode = value as DynamicXML;
- if (string.IsNullOrWhiteSpace(dnode._name))
- dnode._name = binder.Name;
- _properties[binder.Name] = dnode;
- }
- else
- _properties[binder.Name] = value;
- return true;
- }
- public override bool TryGetMember(GetMemberBinder binder, out object result)
- {
- result = null;
- object value = null;
- if (_properties.TryGetValue(binder.Name, out value))
- {
- result = value;
- return true;
- }
- return false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment