C#我有一个超类对象数组,可能包含子类对象。如何测试子类对象&用它的访问者?

时间:2012-05-09 16:49:35

标签: c#

我有Array AutoMobiles 此数组可能包含子类对象TruckCar

如何在数组中测试对象类型的位置? 例如:

if(AutoMobileArray[1].IsObject(Car)){}

Car类具有唯一的访问者

public String BootSpace()

如何使用SubClass对象访问器? 例如:

if(AutoMobileArray[1].IsObject(Car))
{
    BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();
}

4 个答案:

答案 0 :(得分:2)

if(AutoMobileArray[1] is Car){ }

is运营商:http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx

然后您可以转换为适当的类型:

if(AutoMobileArray[1] is Car)
{
    Car car = (Car)AutoMobileArray[1];
    BootSpaceLabel.Text = car.BootSpace();
}

答案 1 :(得分:2)

好吧,如果我理解正确,那就是is运营商:

if(AutoMobileArray[1] is Car)
{
  //Do stuff here
}

要使用子类(子类中定义的访问方法等)进行操作,您需要强制转换:

if(AutoMobileArray[1] is Car)
{
  Car c = (Car)AutoMobileArray[1];
}

答案 2 :(得分:2)

Car car = AutoMobileArray[1] as Car;
if(car != null)
{
    BootSpaceLabel.Text = car.BootSpace();
}

答案 3 :(得分:0)

您可以简单地使用这样的表达式:

if (AutoMobileArray[1] is Car)
{
    BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();
}

虽然有一些解决方法,但如何不使用“is”关键字,例如您可以在AutoMobile类中定义方法,如下所示:

virtual string BootSpace()
{ 
    return string.Empty; 
}

abstract string BootSpace();

override这个方法在Car子类中(和其他子类,根据你的业务逻辑):

override string BootSpace()
{
    //Car bootspace logic here 
}

之后,您只需调用BootSpaceLabel.Text = AutoMobileArray[1].BootSpace();而无需检查对象类型;

更高级和“漂亮”的方法来处理这个问题就是使用“设计模式”。有许多标准设计问题得到有效解决。它们被称为设计模式。在您的情况下,战略模式可能很有用。 http://en.wikipedia.org/wiki/Strategy_pattern