C #: доступ к унаследованным членам частного экземпляра через отражение - PullRequest
17 голосов
/ 26 марта 2009

Я абсолютный новичок в отражении в C #. Я хочу использовать отражение для доступа ко всем закрытым полям в классе, включая те, которые наследуются.

Мне удалось получить доступ ко всем закрытым полям, кроме тех, которые унаследованы, а также ко всем открытым и защищенным наследуемым полям. Однако я не смог получить доступ к закрытым, унаследованным полям. Следующий пример иллюстрирует:

class A
{
    private string a;
    public string c;
    protected string d;
}

class B : A
{
    private string b;
}

class test
{
    public static void Main(string[] Args)
    {
        B b = new B();       
        Type t;
        t = b.GetType();
        FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic
                                         | BindingFlags.Instance); 
        foreach(FieldInfo fi in fields){
             Console.WriteLine(fi.Name);
        }
        Console.ReadLine();
    }
}

Не удается найти поле B.a.

Возможно ли это сделать? Очевидным решением будет преобразование частных, унаследованных полей в защищенные поля. Это, однако, в данный момент вне моего контроля.

Ответы [ 4 ]

14 голосов
/ 26 марта 2009

Как сказал Ли, вы можете сделать это с помощью рекурсии.

private static void FindFields(ICollection<FieldInfo> fields, Type t) {
    var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

    foreach (var field in t.GetFields(flags)) {
        // Ignore inherited fields.
        if (field.DeclaringType == t)
            fields.Add(field);
    }

    var baseType = t.BaseType;
    if (baseType != null)
        FindFields(fields, baseType);
}

public static void Main() {
    var fields = new Collection<FieldInfo>();
    FindFields(fields, typeof(B));
    foreach (FieldInfo fi in fields)
        Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name);
}
4 голосов
/ 26 марта 2009

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

0 голосов
/ 24 июня 2010

Вы можете получить доступ к закрытым членам класса A из класса B с помощью «Вложенных классов». , Вы делаете класс A как внешний класс и класс B как внутренний класс

Class A
{
 ...
 Class B
 {
.......
  }

}
0 голосов
/ 26 марта 2009

Вы не можете получить доступ к закрытым полям A, используя тип B, потому что эти поля не существуют в B - они существуют только в A. Вам нужно либо указать тип A напрямую, либо получить его другими способами (например, получить базовый класс из типа B).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...