我使用反射来循环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++;
}
}
显示子属性的任何帮助
答案 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”进行漂亮打印,而是必须以类似的方式添加节点文本。 此示例的输出为: