TK.
TK.

Reputation: 47913

c# use reflection to get a private member variable from a derived class

I have the following structure:

abstract class Parent {}


class Child : Parent
{   
    // Member Variable that I want access to:
    OleDbCommand[] _commandCollection;

    // Auto-generated code here
}

Is it possible to use reflection from within the Parent class to access the _commandCollection within the Child class? If not any suggestions on how I can achieve this?

EDIT: Its probably worth mentioning that in the abstract Parent class I plan to use IDbCommand[] to handle the _commandCollection object as not all my TableAdapters will be using OleDb to connect to their respective databases.

EDIT2: For all the comments saying ... just add a property of function to the child class, I can't as its automatically generated by the VS Designer. I really don't want to have to re-do my work every time I change something in the designer!

Upvotes: 4

Views: 10044

Answers (2)

Ani
Ani

Reputation: 113472

// _commandCollection is an instance, private member
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;

// Retrieve a FieldInfo instance corresponding to the field
FieldInfo field = GetType().GetField("_commandCollection", flags);

// Retrieve the value of the field, and cast as necessary
IDbCommand[] cc =(IDbCommand[])field.GetValue(this);

Array covariance should ensure that the cast is successful.

I assume some designer will be generating the subclasses? Otherwise, a protected property is probably what you're looking for.

Upvotes: 11

Dan Bryant
Dan Bryant

Reputation: 27515

It's possible, though it's a decidedly bad idea.

    var field = GetType().GetField("_commandCollection", BindingFlags.Instance | BindingFlags.NonPublic);

I think what you really want to do is provide a method for the child classes to provide the parent with the required data:

protected abstract IEnumerable<IDBCommand> GetCommands();

Upvotes: 1

Related Questions