コード例 #1
0
        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--;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #2
0
 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--;
                             }
                         }
                     }
                 }
             }
         }
     }
 }