private void WriteObject(string prefix, object element) { if (element == null || element is ValueType || element is string) { var fo = new FlattenedObject { Key = prefix , Value = element == null , Type = element == null ? (element is string?typeof(String) : null) : element.GetType() }; result.Add(fo); } else { IEnumerable enumerableElement = element as IEnumerable; if (enumerableElement != null) { foreach (object item in enumerableElement) { if (item is IEnumerable && !(item is string)) { if (level < depth) { level++; WriteObject(prefix, item); level--; } } else { WriteObject(prefix, item); } } } else { MemberInfo[] members = element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance); bool propWritten = false; foreach (MemberInfo m in members) { FieldInfo f = m as FieldInfo; PropertyInfo p = m as PropertyInfo; if (f != null || p != null) { if (propWritten) { } else { propWritten = true; } Type t = f != null ? f.FieldType : p.PropertyType; if (t.IsValueType || t == typeof(string)) { result.Add(new FlattenedObject { Key = prefix + m.Name , Value = f != null ? f.GetValue(element) : p.GetValue(element, null) != null?p.GetValue(element, null):null , Type = f != null ? ApiHelper.GetType(f.FieldType.AssemblyQualifiedName) : ApiHelper.GetType(p.PropertyType.AssemblyQualifiedName) , Attributes = m.GetCustomAttributes(false) }); } else { if (typeof(IEnumerable).IsAssignableFrom(t)) { //"..." } else { //"{ }" } } } } if (level < depth) { foreach (MemberInfo m in members) { FieldInfo f = m as FieldInfo; PropertyInfo p = m as PropertyInfo; if (f != null || p != null) { Type t = f != null ? f.FieldType : p.PropertyType; if (!(t.IsValueType || t == typeof(string))) { object value = f != null?f.GetValue(element) : p.GetValue(element, null); if (value != null) { level++; WriteObject(m.Name + ".", value); level--; } } } } } } } }
private void WriteObject_(string prefix, string ukey, object element, PropertyInfo listProperty = null, object elementParent = null) { if (element == null) { } else if (element is ValueType || element is string) { var fo = new FlattenedObject { UniqueKey = ukey, Model = topElement, Key = prefix.TrimEnd('.'), Value = element, Type = element == null ? (element is string?typeof(String) : null) : element.GetType(), ParentListAttributes = listProperty == null ? new object[] { } : listProperty.GetCustomAttributes(false) }; result.Add(fo); } else { IEnumerable enumerableElement = element as IEnumerable; if (enumerableElement != null) { var i = 0; if (ukey.EndsWith(".")) { ukey = ukey.Remove(ukey.Length - 1); } var propName = prefix.TrimEnd('.'); if (propName.IndexOf(".") > -1) { propName = propName.Substring(propName.LastIndexOf(".") + 1); } var listProp = elementParent.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(x => x.Name.Equals(propName)); foreach (object item in enumerableElement) { if (item is IEnumerable && !(item is string)) { if (level < depth) { level++; WriteObject_(prefix, ukey + "[" + i + "].", item, listProperty: listProp, elementParent: element); level--; } } else { WriteObject_(prefix, ukey + "[" + i + "].", item, listProperty: listProp, elementParent: element); } i++; } } else { PropertyInfo[] properties = element.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); bool propWritten = false; foreach (PropertyInfo p in properties) { if (p != null) { if (propWritten) { } else { propWritten = true; } Type t = p.PropertyType; if (t.IsValueType || t == typeof(string)) { var value = p.GetValue(element, null); if (value != null) { result.Add(new FlattenedObject { UniqueKey = ukey + p.Name, Model = topElement, Key = prefix + p.Name, Value = value, Type = ApiHelper.GetType(p.PropertyType.AssemblyQualifiedName), Attributes = p.GetCustomAttributes(false) }); } } else { if (level < depth && !(t.IsValueType || t == typeof(string))) { object value = p.GetValue(element, null); if (value != null) { level++; WriteObject_(prefix + p.Name + ".", ukey + p.Name + ".", value, elementParent: element); level--; } } } } } } } }