C# использовать отражение, чтобы получить закрытую переменную-член из производного класса

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

abstract class Parent {}


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

    // Auto-generated code here
}

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

РЕДАКТИРОВАТЬ: вероятно, стоит упомянуть, что в абстрактном классе Parent я планирую использовать IDbCommand[] для обработки объекта _commandCollection, поскольку не все мои TableAdapters будут использовать OleDb для подключения к своим соответствующим базам данных.

РЕДАКТИРОВАТЬ 2: Для всех комментариев, говорящих... просто добавить свойство функции в дочерний класс, я не могу, поскольку он автоматически генерируется VS Designer. Я действительно не хочу делать свою работу каждый раз, когда я что-то меняю в дизайнере!

2 ответа

Решение
// _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);

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

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

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

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

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

protected abstract IEnumerable<IDBCommand> GetCommands();
Другие вопросы по тегам