private static dynamic GetObject(JObject jobj) { var obj = new FriendlyDynamic() as IDictionary<string, object>; foreach(var pair in jobj) { obj.Add(pair.Key.Replace('-', '_'), GetValue(pair.Value)); } return obj; }
public static dynamic Parse(XDocument xml) { var result = new FriendlyDynamic() as IDictionary<string, object>; var root = xml.Root; AddElement(root, result); return result; }
public void UndefinedPropertyReturnsNull() { dynamic obj = new FriendlyDynamic(); obj.one = "One"; Assert.AreEqual("One", obj.one); Assert.IsNull(obj.two); }
private static void AddElement(XElement el, IDictionary<string, object> parent) { var name = el.Name.LocalName; // check for multiple elements with the same name and convert to list var addToList = parent.ContainsKey(name); IList<dynamic> list = null; if(addToList) { var container = parent[name]; list = container as IList<dynamic>; if(list == null) { // convert to list list = new List<dynamic>(new dynamic[] { container }); parent[name] = list; } } if(el.HasElements || el.HasAttributes) { // complex object var obj = new FriendlyDynamic() as IDictionary<string, object>; if(addToList) { list.Add(obj); } else { parent[name] = obj; } foreach(var attr in el.Attributes()) { obj[attr.Name.LocalName] = attr.Value; } foreach(var child in el.Elements()) { AddElement(child, obj); } if(!el.HasElements && !el.IsEmpty) { var valName = Char.IsUpper(name[0]) ? "Text" : "text"; // mimic case obj[valName] = el.Value; } } else { // simple value if(addToList) { list.Add(el.Value); } else { parent[name] = el.Value; } } }