c#使用reflection从派生类中获取私有成员变量

时间:2010-11-04 14:32:01

标签: c# reflection inheritance

我有以下结构:

abstract class Parent {}


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

    // Auto-generated code here
}

是否可以使用Parent类中的反射来访问Child类中的_commandCollection?如果没有关于如何实现这一目标的任何建议?

修改 可能值得一提的是,在抽象的Parent类中,我计划使用IDbCommand []来处理_commandCollection对象,因为并非所有的TableAdapter都会使用OleDb连接到各自的数据库。

EDIT2: 对于所有的评论说......只是将一个函数的属性添加到子类中,我不能像VS Designer那样自动生成它。每当我改变设计师的某些东西时,我真的不想重新做我的工作!

2 个答案:

答案 0 :(得分:9)

// _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 :(得分:1)

这是可能的,虽然这是一个非常糟糕的主意。

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

我认为您真正想要做的是为子类提供一种方法,为父级提供所需的数据:

protected abstract IEnumerable<IDBCommand> GetCommands();