Hi,
In C#, when I'm reflecting over a derived type, how come I don't see base classes' static fields?
I've tried both type.GetFields(BindingFlags.Static)
and type.GetFields()
.
Thanks
Hi,
In C#, when I'm reflecting over a derived type, how come I don't see base classes' static fields?
I've tried both type.GetFields(BindingFlags.Static)
and type.GetFields()
.
Thanks
Because they belong to the base type, and are not inherited. Move up to that type, and you'll find them.
-- Edit
Mehrdad has the correct answer, but just for completeness:
foreach(FieldInfo f in b.GetType().GetFields(
BindingFlags.Static
| BindingFlags.FlattenHierarchy
| BindingFlags.Instance
| BindingFlags.Public
)){
Console.WriteLine("found: " + f.Name);
}
This is how it works. static
members are really non-object-oriented stuff. They are not polymorphic and they really belong to their declaring type and are unrelated to other types in the inheritance hierarchy. For instance, a static initializer for a base class is not required to run before accessing a static member in a derived class.
static
members of base classes are not returned unless BindingFlags.FlattenHierarchy
is specified:
type.GetFields(BindingFlags.Static
| BindingFlags.FlattenHierarchy
| BindingFlags.Public)
Your type is just your type - it doesn't include base types. You'll need to use BindingFlags.FlattenHierarchy
if you want to search fields in base classes.
You should probably take a look at the BindingFlags documentation to accomplish what you need.
Set the BindingFlags.FlattenHierarchy enumeration to Static and this will also search static members. More information: http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx