如何遍历类属性树?

时间:2011-07-01 11:03:22

标签: c# reflection

class ClassA 
{
   public ClassB myProp {get;set;}
}

class ClassB 
{
   public ClassC anotherProp {get;set;}
}

class ClassC 
{
   public string Name {get;set;}
}

我有一个ClassA类型的对象。如何通过反射迭代递归获取ClassC的Name属性值?

2 个答案:

答案 0 :(得分:3)

我对你想要完成的事情有点粗略。我想你想从ClassA开始,最终遍历属性并进入ClassC。要做到这一点,你大多必须了解如何进行递归编程和少量反射知识。以下是我过去使用过的修改后的代码版本,您可以find here

private void SerializeObject(object obj) {

    Type type = obj.GetType();

    foreach (PropertyInfo info2 in type.GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
    {
        MethodInfo getMethod = info2.GetGetMethod(true);

        if (getMethod != null)
            SerializeObject(getMethod.Invoke(obj, null));
    }

}

这样做是遍历每个属性并使用每个属性的get方法来执行属性并获取正在返回的对象,以便您可以通过调用相同的SerializeObject方法来遍历它。

答案 1 :(得分:0)

好的,解决了。 假设我有物业的路径,我想得到的价值:

ClassB.ClassC.Name

然后,在拆分该parh之后,我在没有递归的情况下遍历树;)

var dataPath = column.SortMemberPath.Split(new char[] { '.' });

[...]

foreach (var item in (System.Collections.IList)myObject)
{
   var newItem = item;

   foreach (var path in dataPath)
   {
         var actalValue = newItem.GetType().GetProperty(path).GetValue(newItem, null);
         newItem = actalValue; //it does the trick
   }

   now, the newItem is my wanted property value 
}