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