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();