KenEucker
KenEucker

Reputation: 5089

GetFields of derived type

I am trying to reflect the fields in a derived type but it's returning the fields of the base type.

public class basetype
{
    string basevar;
}

public class derivedtype : basetype
{
    string derivedvar;
}

In some function:

derivedtype derived = new derivedtype();

FieldInfo[] fields = derived.GetType().GetFields();

This will return basevar, but not derivedvar. I've tried all the different bindings and it doesn't seem to make a difference.

Also, I'm doing this in ASP.NET within App_Code where basevar is defined in App_Code and derivedvar is a user control defined in App_Controls where the types are not in scope.

Upvotes: 7

Views: 7524

Answers (2)

Jon Hanna
Jon Hanna

Reputation: 113302

As is, this will return nothing as the default binding is for public fields only.

As is also, derivedtype isn't derived from basetype

With:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

It returns derivedvar. I've just checked in LINQPad.

If I change derivedtype to be derived from basetype, then I can get both fields with:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray();

Upvotes: 11

Tergiver
Tergiver

Reputation: 14517

Reflection is a bit odd.

If the members are public, all of them up the entire hierarchy are visible.

If the members are non-public, you have to specify BindingFlags.NonPublic and you will only get those members that are of the type used. Inherited members are not visible. If you want to see all the non-public members of a type you'll have to walk up the inheritence chain.

Upvotes: 5

Related Questions