递归获取类的属性和子属性

我在做类似

递归获取对象的属性和子属性的操作,但是我想递归使用反射来获取每个属性。我从递归打印属性中获得了代码。

代码的问题是:它仅下降了一层,我想知道如何使用反射自动获取所有属性?我只是组成了以下示例容器代码:

public class Container

{

public Bottle MyBottle { get; set; }

public List<Address> Addresses { get; set; }

public Container()

{

Address a = new Address();

a.AddressLine1 = "1 Main St";

a.AddressLine2 = "2 Main St";

Addresses = new List<Address>();

Addresses.Add(a);

MyBottle = new Bottle();

MyBottle.BottleName = "Big bottle";

MyBottle.BottageAge = 2;

}

}

public class Bottle

{

public string BottleName { get; set; }

public int BottageAge { get; set; }

}

public class Address

{

public string AddressLine1 { get; set; }

public string AddressLine2 { get; set; }

public List<SpecialFolder> SpecialFolders { get; set; }

public Address()

{

SpecialFolders = new List<SpecialFolder>();

SpecialFolder sf = new SpecialFolder();

sf.TemplateFolder = Environment.SpecialFolder.Templates.ToString();

sf.UserFolder = Environment.SpecialFolder.UserProfile.ToString();

SpecialFolders.Add(sf);

}

}

public class SpecialFolder

{

public string TemplateFolder { get; set; }

public string UserFolder { get; set; }

}

在Main方法中:

static void Main(string[] args)

{

Container c = new Container();

PrintProperties(c);

}

public static void PrintProperties(object obj)

{

PrintProperties(obj, 0);

}

public static void PrintProperties(object obj, int indent)

{

if (obj == null) return;

string indentString = new string(' ', indent);

Type objType = obj.GetType();

PropertyInfo[] properties = objType.GetProperties();

foreach (PropertyInfo property in properties)

{

object propValue = property.GetValue(obj, null);

if (property.PropertyType.Assembly == objType.Assembly)

{

Console.WriteLine("{0}{1}:", indentString, property.Name);

PrintProperties(propValue, indent + 2);

}

else

{

Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);

}

}

}

我希望得到:

MyBottle:

BottleName: Big bottle

BottageAge: 2

Addresses:

AddressLine1: 1 Main St

AddressLine2: 2 Main St

SpecialFolders:

TemplateFolder: Templates

UserFolder: UserProfile

我现在得到的结果是:

MyBottle:

BottleName: Big bottle

BottageAge: 2

Addresses: System.Collections.Generic.List`1[TreeViewReflectionExample.Address]

有人可以通过PrintProperties方法帮助我吗?非常感谢你。

回答:

您的代码有两个问题:

  1. 因为条件的缘故,if (property.PropertyType.Assembly == objType.Assembly)你会System.CollectionsList<>
  2. 您不会对propValue集合有不同的对待。因此它将打印List属性,而不是其元素属性。

您可以将其更改为例如:

public void PrintProperties(object obj, int indent)

{

if (obj == null) return;

string indentString = new string(' ', indent);

Type objType = obj.GetType();

PropertyInfo[] properties = objType.GetProperties();

foreach (PropertyInfo property in properties)

{

object propValue = property.GetValue(obj, null);

var elems = propValue as IList;

if (elems != null)

{

foreach (var item in elems)

{

PrintProperties(item, indent + 3);

}

}

else

{

// This will not cut-off System.Collections because of the first check

if (property.PropertyType.Assembly == objType.Assembly)

{

Console.WriteLine("{0}{1}:", indentString, property.Name);

PrintProperties(propValue, indent + 2);

}

else

{

Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);

}

}

}

}

以上是 递归获取类的属性和子属性 的全部内容, 来源链接: utcz.com/qa/420192.html

回到顶部