显示所有属性,如果属性是类,则显示其属性

时间:2017-10-25 09:38:33

标签: c# reflection

我使用反射来循环DLL的类并显示该类的属性;但有些情况下属性是另一个类,我需要遍历该属性的属性并显示它们。

我目前拥有的仅显示属性,而不显示子属性:

treeView1.Nodes.Clear();

Assembly assembly = Assembly.LoadFrom(@"Path\Domain.dll");

            int count = 0;
            foreach (Type type in assembly.GetTypes().Where(t => t.IsClass))
            {               
                var node = treeView1.Nodes.Add(type.FullName);

                var x = ((System.Reflection.TypeInfo)((assembly.GetTypes()))[count]).DeclaredProperties;

                x.ToList().ForEach(item => treeView1.Nodes[count].Nodes.Add(item.Name));

                count++;                
            }           
        }

显示子属性的任何帮助

1 个答案:

答案 0 :(得分:0)

你可以做的是递归地进行迭代。创建一个显示属性的成员,并使用子属性调用成员本身。这可能会给你一个想法:

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myObject = new MyClass();
            ListProperties(myObject.GetType(), 2);
            Console.ReadLine();
        }

        static void ListProperties(Type type, int ident)
        {
            var x = type.GetProperties();
            Console.WriteLine(new String(' ', ident) + "Class: " + type.FullName);
            int newIdent = ident += 2;
            x.ToList().Where(item => item.PropertyType.IsClass).ToList().ForEach(item => ListProperties(item.PropertyType, newIdent));

        }
    }

    class MyClass
    {
        public SubClass PropertySubClass1 { get; set; }

        public SubClass PropertySubClass2 { get; set; }

    }

    class SubClass
    {
        public SubSubClass PropertySubSubClass { get; set; }
    }

    class SubSubClass
    {

    }
}

在Main中的这段代码片段中,您会看到成员ListProperties被调用。在此成员中,列出属性类型,然后它调用自身(在子属性的最后一行)。 在此示例中,不必使用“ident”进行漂亮打印,而是必须以类似的方式添加节点文本。 此示例的输出为:

enter image description here