如何从基类数组访问派生类字段?

时间:2014-01-28 21:50:49

标签: c# arrays derived-class

我浏览了类似的线程,它们都与C ++有关,所以我认为最好不要只是摸索。例如,我有这段代码:

foo[] fooArray = new foo[5];
fooArray[2] = new bar();

假设foo是一个没有变量/方法的自定义类:

public class foo
{

}

bar是从foo派生的自定义类:

public class bar : foo
{
    int fooBar = 0;
}

在我的fooArray中,我需要从fooBar访问变量fooArray[2],这是bar,但因为变量没有出现在基类中,它不会显示在foo的数组中。有什么方法可以访问它吗?

编辑:在应用程序代码中,foo和bar都具有所需的构造函数和其他设置。

4 个答案:

答案 0 :(得分:1)

你可以投。为了安全起见,您应该使用as关键字:

bar b = fooArray[2] as bar
if ( b != null ){
   //Do stuff with b.foobar
} else {
   //Handle the case where it wasn't actually a bar
}

答案 1 :(得分:0)

由于foo类没有fooBar字段。除非将变量转换为Bar,否则无法访问它:

fooArray[2] = new bar();
var value = ((bar)fooArray[2]).fooBar;

注意:fooBar字段应为公开 .Fields默认为私有

答案 2 :(得分:0)

您可以将数组中的一个项目投射到bar并以此方式访问,

bar barVar = (bar)fooArray[2];
int fooBarInt = barVar.fooBar;

或使用as运算符将对象视为类型bar

bar barVar = fooArray[2] as bar;
if (barVar != null)
{
    // user barVar.fooBar;
}

但是,在示例fooBar中定义它的方式是private。你必须让它public在课堂外访问它。

public class bar : foo
{
    public int fooBar = 0;
}

答案 3 :(得分:0)

要访问它,您需要将值转换为bar实例

int i = ((bar)fooArray[2]).foobar;

请注意,如果fooArray[2]实际上不是bar的实例,则此代码将引发异常。如果您只想在fooArray[2]bar时执行此操作,请执行以下操作

bar b = fooArray[2] as bar;
if (b != null) {
  int i = b.foobar;
  ...
}