С# 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);
}
Ответ 3
Установите для перечисления BindingFlags.FlattenHierarchy значение Static, и оно также будет искать статические члены. Больше информации:
http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx
Ответ 4
Ваш тип - только ваш тип - он не включает базовые типы. Вам нужно будет использовать BindingFlags.FlattenHierarchy
, если вы хотите искать поля в базовых классах.
Вероятно, вам стоит взглянуть на документацию BindingFlags, чтобы выполнить то, что вам нужно.