65.9K
CodeProject is changing. Read more.
Home

Accessing Base Private Members from Child

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Oct 20, 2011

LGPL3

2 min read

viewsIcon

13209

Accessing base private members from child

I have been thinking about how to prove to myself that base class members do get inherited to their child classes (sub classes) but still they remain private. Actually, I had read these lines in many places in my earlier days. But I always wanted to validate it.

So I set to write code for that and hence I started using Reflection. It’s the only way one can open the package (object) and see inside it at run time, because I knew this inheritance really come alive at run time. Of course, it's a known fact you might think.

Just to let you know this idea popped up in my mind when I started my real programming career. So it's a shame that I am writing about it now.

To access members, I am using Type.BaseType.GetMethods() API and for fields, I am using Type.BaseType.GetFields() API.

This is how I did it, although I must honestly admit that the entire idea I could not conceive by myself on how to implement so I had to take a look at Stackoverflow threads on the same.

So below is the code:

public class Base
{
int basePrivateVariable;

void Hello() { }
}

public class Child : Base
{
}

BindingFlags flag = BindingFlags.NonPublic | BindingFlags.Instance;
var privateMethods = typeof(Child).BaseType.GetMethods(flag);
var privateFields = typeof(Child).BaseType.GetFields(flag);

I am still looking (curious or craziness of mine you can say) to achieve the same without using BaseType property on a Type. No, this is not solving any real world problem for me, but I am just curious because using BaseType property of Type class, I am convinced that while writing it in my code editor (Visual Studio), I know for sure that I am accessing base class members because I am using BaseType property. So I want something like generics wherein at compile time, you’re not convinced/know what type you will be accessing or what type your block code gets. The same I want to access base class members by using only Child object and its level reflection API, i.e., without using BaseType property. If you know, kindly comment.

Thanks for reading!