С# Reflection - статические поля базового класса в производном типе

В С#, когда я размышляю над производным типом, почему я не вижу статические поля базовых классов?

Я пробовал как type.GetFields(BindingFlags.Static), так и type.GetFields().

Ответы

Ответ 1

Вот как это работает. static участники действительно не объектно-ориентированные вещи. Они не являются полиморфными, и они действительно принадлежат к их объявляющему типу и не связаны с другими типами в иерархии наследования. Например, статический инициализатор для базового класса не требуется запускать перед доступом к статическому члену в производном классе.

static члены базовых классов не возвращаются, если не указано BindingFlags.FlattenHierarchy:

type.GetFields(BindingFlags.Static 
             | BindingFlags.FlattenHierarchy
             | BindingFlags.Public)

Ответ 2

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

- Изменить

Мехрдад имеет правильный ответ, но только для полноты:

foreach(FieldInfo f in b.GetType().GetFields(
    BindingFlags.Static
    | BindingFlags.FlattenHierarchy
    | BindingFlags.Instance
    | BindingFlags.Public
    )){
    Console.WriteLine("found: " + f.Name);
}

Ответ 4

Ваш тип - только ваш тип - он не включает базовые типы. Вам нужно будет использовать BindingFlags.FlattenHierarchy, если вы хотите искать поля в базовых классах.

Вероятно, вам стоит взглянуть на документацию BindingFlags, чтобы выполнить то, что вам нужно.