C # Reflection - Статические поля базового класса в производном типе - PullRequest
13 голосов
/ 25 августа 2009

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

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

Ответы [ 4 ]

20 голосов
/ 25 августа 2009

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

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

type.GetFields(BindingFlags.Static 
             | BindingFlags.FlattenHierarchy
             | BindingFlags.Public)
6 голосов
/ 25 августа 2009

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

- Правка

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

foreach(FieldInfo f in b.GetType().GetFields(
    BindingFlags.Static
    | BindingFlags.FlattenHierarchy
    | BindingFlags.Instance
    | BindingFlags.Public
    )){
    Console.WriteLine("found: " + f.Name);
}
5 голосов
/ 25 августа 2009

Установите перечисление BindingFlags.FlattenHierarchy в Static, и это также будет искать статические члены. Дополнительная информация: http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx

3 голосов
/ 25 августа 2009

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

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

...