首页 > 其他分享 >小工具 --- 树形展示多属性复杂结构类

小工具 --- 树形展示多属性复杂结构类

时间:2023-08-13 18:46:09浏览次数:39  
标签:arr string --- 树形 PropertyType var sb property 属性

灵感

最近在做配置模块,然后整个配置的参数是非常多的,层级结构也很深。可能有几百个参数,三、四层的层级关系,想要捋顺所有的类和参数,太繁琐了,而且 Visual Studio 的类视图只能看到属性,却看不出层级关系来,所以花费些许精力,写一个控制台小程序,展示类结构。

原理就是通过反射得到所有属性,遍历展示,有层级关系的递归展示。

代码如下:

public static void PrintProperties(object obj, int indentLevel, ref StringBuilder sb)
{
    try
    {
        var type = obj.GetType();

        var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (var property in properties)
        {
            string[] arr = new string[] { "", "", "" };

            if (property.PropertyType.IsClass && property.PropertyType != typeof(string))
            {
                var value = property.GetValue(obj);

                if (value == null && !property.PropertyType.IsArray)
                {
                    value = Activator.CreateInstance(property.PropertyType);
                }
                // 判断属性的类型是否为泛型类型
                if (property.PropertyType.IsGenericType)
                        {

                            // 获取属性的泛型类型定义
                            var typeDefinition = property.PropertyType.GetGenericTypeDefinition();

                            Type[] typeArgs = value.GetType().GetGenericArguments();

                            var temp = Activator.CreateInstance(typeArgs[0]);

                            // 判断泛型类型是否为 IEnumerable<T>
                            if (typeDefinition == typeof(IEnumerable<>))
                            {
                                arr[0] = "IEnumerable<";
                                arr[1] = typeArgs[0].Name;
                                arr[2] = "> ";
                            }
                            else if (typeDefinition == typeof(List<>))
                            {
                                arr[0] = "List<";
                                arr[1] = typeArgs[0].Name;
                                arr[2] = "> ";
                            }

                            // 判断泛型类型是否为 ICollection<T>
                            else if (typeDefinition == typeof(ICollection<>))
                            {
                                arr[0] = "ICollection<";
                                arr[1] = typeArgs[0].Name;
                                arr[2] = "> ";
                            }
                            else if (typeDefinition == typeof(Dictionary<,>))
                            {
                                arr[0] = "Dictionary<";
                                arr[1] = string.Join(",", typeArgs.Select(t => t.Name));
                                arr[2] = "> ";

                            }

                            sb.Append(new string(' ', indentLevel * 4));
                            sb.AppendLine("- " + string.Join("", arr) + property.Name);

                            PrintProperties(temp, indentLevel + 1, ref sb);
                        }
                else
                {
                    arr[0] = "";
                    arr[1] = property.PropertyType.Name;
                    arr[2] = " ";

                    sb.Append(new string(' ', indentLevel * 4));
                    sb.AppendLine("- " + string.Join("", arr) + property.Name);
                    //如果是数组,就不需要在递归
                    if (!property.PropertyType.IsArray)
                        PrintProperties(value, indentLevel + 1, ref sb);
                }
            }
            else
            {
                arr[0] = "";
                arr[1] = property.PropertyType.Name;
                arr[2] = " ";

                sb.Append(new string(' ', indentLevel * 4));
                sb.AppendLine("- " + string.Join("", arr) + property.Name);
            }
        }
    }
    catch (Exception ex)
    {

        throw;
    }
}


实例图:

image.png

标签:arr,string,---,树形,PropertyType,var,sb,property,属性
From: https://www.cnblogs.com/pandefu/p/17536268.html

相关文章

  • maven系列:属性管理和版本管理
    目录一、属性配置与使用①:定义属性②:引用属性二、资源文件引用属性①:定义属性②:配置文件中引用属性③:开启资源文件目录加载属性的过滤器④:配置maven打war包时,忽略web.xml检查三、其他属性(了解)四、版本管理工程版本发布版本定义属性有什么好处?一、属性配置与使用①:定义属性......
  • nacos安装-win
    Nacos安装指南1.Windows安装开发阶段采用单机安装即可。1.1.下载安装包在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:GitHub主页:https://github.com/alibaba/nacosGitHub的Release下载页:https://github.com/alibaba/nacos/releases如图:1.2.解......
  • 数据结构与算法 --- 组数、链表、栈和队列(一)
    数组、链表、栈和队列是四种基础数据结构,他们是高级、复杂的数据结构和算法的基础。本篇先来讲述数组,链表,及算法的优化策略。数组定义数组:数组是一种线性表数据结构,它用一组连续的内存空间存储一组具有相同类型的数据。定义中有三个关键词:线性表连续的内存空间相同类型数......
  • 数据结构与算法 --- “哨兵”思想
    引言哨兵思想是指在算法中使用一个特殊值来检测或标记某些条件的发生,它的目的是为了简化代码,并使其更容易理解,常常用于在循环中优化边界条件的判断。介绍在算法中,"哨兵"思想是指在循环中设置一个特殊的元素(称为哨兵),以便在循环过程中能够更高效地处理某些边界情况或结束条件。......
  • 数据结构与算法 --- 组数、链表、栈和队列(二)
    继数据结构与算法---组数、链表、栈和队列(一)讲解完数组,链表及算法的优化策略之后,接下来继续讲解两种特殊的线性表结构,栈和队列。栈对“栈”有一个很形象的比喻,栈就像一摞叠在一起的盘子,放盘子时,只能放在上面,不能将盘子插入到中间的任意位置;取盘子时,只能从最上面取,不能从中间任......
  • 解读 --- 深拷贝
    引言深拷贝是指创建一个新对象,该对象的值与原始对象完全相同,但在内存中具有不同的地址。这意味着如果您对原始对象进行更改,则不会影响到复制的对象常见的C#常见的深拷贝方式有以下4类:各种形式的序列化及反序列化。通过反射机制获取该对象的所有字段和属性信息。遍历所有字段......
  • 数据结构与算法 --- 排序算法(一)
    引言按照时间复杂度,将一些常见排序算法进行分类,分为以下三类:\(O(n^2)\):冒泡排序,插入排序,选择排序。\(O(nlogn)\):快速排序,归并排序。\(O(n)\):桶排序,计数排序,基数排序。本篇文章讨论以下第一类:冒泡排序,插入排序,选择排序。上一篇数据结构与算法---如何分析排序算法提......
  • 数据结构与算法 --- 递归(二)
    引言上文数据结构与算法---递归(一)讲述了什么是递归算法,如何编写递归算法及如何写好递归算法,本文着重讲述一下如何避免递归过深导致的堆栈溢出问题。探究产生堆栈溢出的原因函数调用采用函数调用栈来保存当前“快照”(局部变量,返回地址等)。函数调用栈是内存中开辟的一块存储空......
  • 数据结构与算法 --- 递归(一)
    什么是递归?递归(Recursion)是一种解决问题的方法,它将问题分解为更小的子问题,并逐层解决这些子问题。递归算法的核心思想是:一个函数可以直接或间接地调用自身。通过这种自我调用,我们可以用简洁的代码来解决复杂问题。满足递归的条件一般来说,满足下面三个条件就可以使用递归:待......
  • 数据结构与算法 --- 排序算法(二)
    title:数据结构与算法---排序算法(二)category:数据结构与算法tags:算法updatedAt:2023-05-18T15:29:17.847ZcreatedAt:2023-05-13T14:43:31.656Z引言上一篇数据结构与算法---排序算法(一)中,学习了冒泡排序,插入排序,选择排序这三种时间复杂度为\(O(n^2)\)的算法。实......