using System.Collections.Generic;
public static void Main()
FW.Expando dynamicObject =
d = new { sa = 1, sb = "abv", sc = new int[] { 1, 2, 3 } }
const string newProp = "e";
dynamicObject[newProp] = "New val";
dynamicObject["f"] = false;
dynamicObject["f"] = null;
dynamicObject["f"] = DBNull.Value;
dynamicObject["d", "sd"] = "SDSDSD";
var a = dynamicObject["d", "sd"];
dynamicObject["d", "sd"] = DBNull.Value;
dynamicObject["d", "se"] = null;
dynamicObject[prop] = (dynamicObject[prop] as int[]).Append(3).ToArray();
dynamicObject["b"] += " ABCD";
dynamicObject["d", "sb"] = new string[] { "New", "Array" };
dynamicObject["d", "sa"] += 5;
dynamicObject["d", "sa"] = new { dz = "ABA", zz = "WCC", ZXXX = new { Y1 = "1", Y2 = "2" } };
dynamicObject["parent", "node"] = "New field";
dynamicObject["parent-node", "node-lvl1", "node-lvl1.1"] = "P > 1 > 1.1";
dynamicObject["parent-node", "node-lvl1", "node-lvl1.2"] = "P > 1 > 1.2";
dynamicObject["parent-node", "node-lvl2", "node-lvl2.1"] = "P > 2 > 2.1";
dynamicObject["parent-node", "m-node", "sub1", "sub2", "sub3"] = "WARCRAFT";
dynamicObject["parent-node", "m-node", "sub1"] =
sub2 = new { sub3 = "WARCRAFT" },
dynamicObject["parent-node", "m-node", "sub2"] = "BLACK THRONE";
dynamicObject["parent-node", "m-node", "sub1", "sub2"] = DBNull.Value;
object propValue = dynamicObject[prop];
object propValueString = dynamicObject["parent-node", "node-lvl1"];
string result = Newtonsoft.Json.JsonConvert.SerializeObject(dynamicObject.root);
Console.WriteLine("\r\n" + result.ToString() + "\r\n");
public Expando(dynamic value)
public ExpandoObject root { get; internal set; }
private ExpandoObject ToExpando(dynamic dynamicObject)
if ((dynamicObject as object).GetType().Name == "ExpandoObject") return dynamicObject;
if (!(dynamicObject as object).GetType().IsGenericType) throw new Exception("No generic type");
ExpandoObject expando = new ExpandoObject();
.ForEach(p => expando.fwAddProp(p.Name, p.GetValue(dynamicObject) as object));
public dynamic this[string prop]
get => root.fwReadProp(prop);
if (DBNull.Value.Equals(value))
root.fwAddProp(prop, value as object);
public dynamic this[params string[] props]
var returnValue = root as IDictionary<string, object>;
foreach (string prop in props)
var temp = returnValue[prop];
if (temp.GetType().Name != "ExpandoObject" && !temp.GetType().IsGenericType) return temp;
else returnValue = temp as IDictionary<string, object>;
List<ExpandoObject> list = new List<ExpandoObject>();
List<string> nodeProps = props.ToList();
nodeProps.ForEach(prop =>
if (nodeProps.Count == ++i) return;
var newProp = list.Last().fwReadProp(prop);
try { list.Add(ToExpando(newProp)); }
ExpandoObject expandoTemp = new ExpandoObject();
int indexProps = nodeProps.Count - 1;
if (DBNull.Value.Equals(value))
if (!list.Last().fwRemoveProp(nodeProps[i]))
list.RemoveAt(list.Count - 1);
list.Last().fwRemoveProp(nodeProps[i]);
list.Last().fwAddProp(nodeProps[indexProps--], value as object);
ExpandoObject ExpandoTemp = list.Last();
list.RemoveAt(list.Count - 1);
list.Reverse<ExpandoObject>().ToList().ForEach(node =>
node.fwAddProp(nodeProps[indexProps--], ExpandoTemp as object);
public static class extExpandoObject
public static bool fwRemoveProp(this ExpandoObject expando, string propertyName)
var expandoDict = expando as IDictionary<string, object>;
if (!expandoDict.ContainsKey(propertyName)) return false;
expandoDict.Remove(propertyName);
public static void fwAddProp(this ExpandoObject expando, string propertyName, object propertyValue)
var expandoDict = expando as IDictionary<string, object>;
if (expandoDict.ContainsKey(propertyName))
expandoDict[propertyName] = propertyValue;
expandoDict.Add(propertyName, propertyValue);
public static object fwReadProp(this ExpandoObject expando, string propertyName)
var expandoDict = expando as IDictionary<string, object>;
if (expandoDict.ContainsKey(propertyName))
return expandoDict[propertyName];