我在做类似 递归获取对象的属性和子属性的操作,但是我想递归使用反射来获取每个属性。我从递归打印属性中获得了代码。
代码的问题是:它仅下降了一层,我想知道如何使用反射自动获取所有属性?我只是组成了以下示例容器代码:
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方法帮助我吗?非常感谢你。
您的代码有两个问题:
if (property.PropertyType.Assembly == objType.Assembly)
System.Collections
List<>
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); } } } }