C# 使用基类数组访问子类的属性

C# 使用基类数组访问子类的属性,c#,properties,unity3d,C#,Properties,Unity3d,我正在Unity中编写一个游戏,遇到了访问子类属性的问题 我有一个名为“Component”的基类,它只用于将继承它的所有子类组合在一起。我有一个“Track”类,它继承了具有一些公共属性的组件 public class Track : Component { public int x; public int y; } 另一个类保留一个组件数组并对其进行更改 public class Example: MonoBehaviour { private Compone

我正在Unity中编写一个游戏,遇到了访问子类属性的问题

我有一个名为“Component”的基类,它只用于将继承它的所有子类组合在一起。我有一个“Track”类,它继承了具有一些公共属性的组件

public class Track : Component {

    public int x;
    public int y;

}
另一个类保留一个组件数组并对其进行更改

public class Example: MonoBehaviour {

    private Component[] components = new Component[10];

    void Start () {

        components[0] = new Track();
        components[0].x = 5; //Does not compile

    }
}

我不确定如何使用基类组件数组访问Track中的属性。我感谢任何人能提供的帮助。谢谢

如果您确定这是一首
曲目
,您可以将其转换为该类型:

components[0] = new Track();

((Track)components[0]).x = 5;
在本例中,您可以确定它是一个
轨迹,因为您刚刚实例化了它

但是,如果其他类也可能继承自
组件
,并且您的
组件
集合可能没有
轨迹
的实例,则您需要在执行分配之前先进行检查

var track = components[0] as Track;

if (track != null)
    track.x = 5;

如果您确定它是
曲目
,则可以将其转换为该类型:

components[0] = new Track();

((Track)components[0]).x = 5;
在本例中,您可以确定它是一个
轨迹,因为您刚刚实例化了它

但是,如果其他类也可能继承自
组件
,并且您的
组件
集合可能没有
轨迹
的实例,则您需要在执行分配之前先进行检查

var track = components[0] as Track;

if (track != null)
    track.x = 5;

如果您确定它是
曲目
,则可以将其转换为该类型:

components[0] = new Track();

((Track)components[0]).x = 5;
在本例中,您可以确定它是一个
轨迹,因为您刚刚实例化了它

但是,如果其他类也可能继承自
组件
,并且您的
组件
集合可能没有
轨迹
的实例,则您需要在执行分配之前先进行检查

var track = components[0] as Track;

if (track != null)
    track.x = 5;

如果您确定它是
曲目
,则可以将其转换为该类型:

components[0] = new Track();

((Track)components[0]).x = 5;
在本例中,您可以确定它是一个
轨迹,因为您刚刚实例化了它

但是,如果其他类也可能继承自
组件
,并且您的
组件
集合可能没有
轨迹
的实例,则您需要在执行分配之前先进行检查

var track = components[0] as Track;

if (track != null)
    track.x = 5;

更正它需要显式类型转换,但您需要注意运行时问题,使用as运算符的第二个版本将是更好的选择,因为它在任何情况下都不会引发异常,只需要null checkThank,Grant。看来我在试着自己投时少了几个括号。我已经用你的解决方案解决了这个问题!更正它需要显式类型转换,但您需要注意运行时问题,使用as运算符的第二个版本将是更好的选择,因为它在任何情况下都不会引发异常,只需要null checkThank,Grant。看来我在试着自己投时少了几个括号。我已经用你的解决方案解决了这个问题!更正它需要显式类型转换,但您需要注意运行时问题,使用as运算符的第二个版本将是更好的选择,因为它在任何情况下都不会引发异常,只需要null checkThank,Grant。看来我在试着自己投时少了几个括号。我已经用你的解决方案解决了这个问题!更正它需要显式类型转换,但您需要注意运行时问题,使用as运算符的第二个版本将是更好的选择,因为它在任何情况下都不会引发异常,只需要null checkThank,Grant。看来我在试着自己投时少了几个括号。我已经用你的解决方案解决了这个问题!