c # использовать отражение, чтобы получить закрытую переменную-член из производного класса - PullRequest
3 голосов
/ 04 ноября 2010

У меня есть следующая структура:

abstract class Parent {}


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

    // Auto-generated code here
}

Можно ли использовать отражение из класса Parent для доступа к _commandCollection в классе Child? Если нет каких-либо предложений о том, как мне этого добиться?

EDIT: Вероятно, стоит упомянуть, что в абстрактном классе Parent я планирую использовать IDbCommand [] для обработки объекта _commandCollection, поскольку не все мои TableAdapter будут использовать OleDb для подключения к своим соответствующим базам данных.

EDIT2: Для всех комментариев, говорящих ... просто добавить свойство функции в дочерний класс, я не могу, так как он автоматически генерируется VS Designer. Я действительно не хочу делать свою работу каждый раз, когда меняю что-то в дизайнере!

Ответы [ 2 ]

9 голосов
/ 04 ноября 2010
// _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);

Ковариация массива должна обеспечить успешное приведение.

Я предполагаю, что какой-то дизайнер будет создавать подклассы? В противном случае защищенное свойство - это, вероятно, то, что вы ищете.

1 голос
/ 04 ноября 2010

Возможно, хотя это явно плохая идея.

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

Я думаю, что вы действительно хотите сделать, это предоставить метод для дочерних классов, чтобы предоставить родителю необходимые данные:

protected abstract IEnumerable<IDBCommand> GetCommands();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...