С# GetValue PropertyInfo с подклассами

Прежде всего, извините за мой плохой английский... Надеюсь, вы поймете, что я хочу сказать.

У меня проблема с небольшим кодом, где мне нужно получить значение свойств класса. (Это не мой полный проект, а концепция того, что я хочу сделать. И с этим простым кодом я заблокирован.)

Вот код: (Этот образец работает правильно.)

using System;
using System.Reflection;

class Example
{
    public static void Main()
    {
        test Group = new test();
        BindingFlags bindingFlags = BindingFlags.Public |
                                    BindingFlags.NonPublic |
                                    BindingFlags.Instance |
                                    BindingFlags.Static;
        Group.sub.a = "allo";
        Group.sub.b = "lol";

        foreach (PropertyInfo property in Group.GetType().GetField("sub").FieldType.GetProperties(bindingFlags))
        {
            string strName = property.Name;
            Console.WriteLine(strName + " = " + property.GetValue(Group.sub, null).ToString());
            Console.WriteLine("---------------");
        }
    }
}

public class test
{
    public test2 sub = new test2();
}

public class test2
{
    public string a { get; set; }
    public string b { get; set; }
}

Но я хочу заменить Group.sub на динамический доступ (например, foreach на GetField(Var), где это работает). Перепробовал много комбинаций, но решения так и не нашел.

property.GetValue(property.DeclaringType, null)

or

property.GetValue(Group.GetType().GetField("sub"), null)

or

property.GetValue(Group.GetType().GetField("sub").FieldType, null)

Так что я думаю, вы понимаете. Я хотел бы динамически передать экземпляр объекта Group.sub. Потому что в моем полном проекте у меня много подклассов.

Любые идеи?


person Kevin Joss    schedule 05.01.2017    source источник


Ответы (1)


Вы уже получаете доступ к полю sub с помощью Group.GetType().GetField("sub"), вам нужно получить его значение и сохранить его:

FieldInfo subField = Group.GetType().GetField("sub");

// get the value of the "sub" field of the current group
object subValue = subField.GetValue(Group);
foreach (PropertyInfo property in subField.FieldType.GetProperties(bindingFlags))
{
    string strName = property.Name;
    Console.WriteLine(strName + " = " + property.GetValue(subValue, null).ToString());    
}
person C.Evenhuis    schedule 05.01.2017
comment
Спасибо C:Evenhuis за ответ. Это именно то, что я хочу сделать! Я проверил, и это работает. Можем ли мы сделать то же самое с добавлением уровня? Подполе FieldInfo = Group.GetType().GetField(sub); объект subValue = subField.GetValue(Group); FieldInfo subField2 = Group.GetType().GetField(sub).FieldType.GetField(sub2); объект subValue2 = subField2.GetValue(subValue); Или существует более быстрый способ? - person Kevin Joss; 05.01.2017
comment
Да можно, и можно держаться за прежние результаты - т.е. чтобы получить информацию о поле sub2, вам не нужно начинать с Group.GetType()...; вы можете использовать subField.FieldType.GetField("sub2"). - person C.Evenhuis; 05.01.2017
comment
Спасибо, К. Эвенхейс. я так и делал=) - person Kevin Joss; 06.01.2017