Как перебрать дерево свойств класса? - PullRequest
1 голос
/ 01 июля 2011
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 ]

3 голосов
/ 01 июля 2011

Я был немного отрывочен в том, чего ты хотел достичь. Я думаю, что вы хотите начать с ClassA и в конечном итоге пройти через свойства и добраться до ClassC. Чтобы сделать это, вы в основном должны понимать, как выполнять рекурсивное программирование, и немного разбираться в Reflection. Вот модифицированная версия кода, которую я использовал в прошлом, которую вы можете найти здесь .

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.

0 голосов
/ 01 июля 2011

Хорошо, решено.Допустим, у меня есть путь к свойству, значение которого я хочу получить:

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 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...