C# 如何使用C中的公共超类修改对象列表的成员?

C# 如何使用C中的公共超类修改对象列表的成员?,c#,list,inheritance,C#,List,Inheritance,我在VisualStudio中实现了一个WindowsForms应用程序。现在我有一个玩具清单: List <Toy> toys; Toy是一个抽象类,汽车、潜艇等类都是从中派生出来的。当然,该列表可以包含Toy类型的任何对象。由于我缺乏C语言方面的经验,我不确定如何修改这个列表中的对象I。E更改特定于类型的属性。编译器只知道列表中包含玩具对象,无法访问潜艇对象的字段。所以我不能简单地从列表中提取一些元素,调用setter并完成它。强制转换只会得到列表对象强制转换为某种类型的副本。

我在VisualStudio中实现了一个WindowsForms应用程序。现在我有一个玩具清单:

List <Toy> toys;

Toy是一个抽象类,汽车、潜艇等类都是从中派生出来的。当然,该列表可以包含Toy类型的任何对象。由于我缺乏C语言方面的经验,我不确定如何修改这个列表中的对象I。E更改特定于类型的属性。编译器只知道列表中包含玩具对象,无法访问潜艇对象的字段。所以我不能简单地从列表中提取一些元素,调用setter并完成它。强制转换只会得到列表对象强制转换为某种类型的副本。我如何才能做到这一点?

您必须铸造物品:

Engine door = toys.OfType<Car>().Select(c => c.Engine).FirstOrDefault();

您必须投射项目:

Engine door = toys.OfType<Car>().Select(c => c.Engine).FirstOrDefault();

如果您对Lync不了解,或者希望对该项目做更多的工作,您也可以采用“老派”的循环方式来完成

给定示例类:

public abstract class Toy
{
    public string Manufacturer { get; set; }
}

public class Elephant : Toy
{
    public int TrunkLength { get; set; }
}

public class Car : Toy
{
    public Color Color { get; set; }
}
您可以执行以下操作来添加项目,然后根据其类型对其进行修改:

var toys = new List<Toy>
{
    new Car {Color = Color.Red, Manufacturer = "HotWheels"},
    new Elephant {TrunkLength = 36, Manufacturer = "Steiff Harlequin"}
};

foreach (var toy in toys)
{
    var car = toy as Car;
    if (car != null)
    {
        // Set properties or call methods on the car here
        car.Color = Color.Blue;

        // Continue the loop
        continue;
    }

    var elephant = toy as Elephant;
    if (elephant != null)
    {
        // Do something with the elephant object
        elephant.TrunkLength = 48;

        // Continue the loop
        continue;
    }
}

如果您对Lync不了解,或者希望对该项目做更多的工作,您也可以采用“老派”的循环方式来完成

给定示例类:

public abstract class Toy
{
    public string Manufacturer { get; set; }
}

public class Elephant : Toy
{
    public int TrunkLength { get; set; }
}

public class Car : Toy
{
    public Color Color { get; set; }
}
您可以执行以下操作来添加项目,然后根据其类型对其进行修改:

var toys = new List<Toy>
{
    new Car {Color = Color.Red, Manufacturer = "HotWheels"},
    new Elephant {TrunkLength = 36, Manufacturer = "Steiff Harlequin"}
};

foreach (var toy in toys)
{
    var car = toy as Car;
    if (car != null)
    {
        // Set properties or call methods on the car here
        car.Color = Color.Blue;

        // Continue the loop
        continue;
    }

    var elephant = toy as Elephant;
    if (elephant != null)
    {
        // Do something with the elephant object
        elephant.TrunkLength = 48;

        // Continue the loop
        continue;
    }
}

所以。。。你基本上有这样的情况

public abstract class Toy 
{ 
}

public class Submarine : Toy 
{ 
    public bool IsOccupiedByPretendPeople { get; set; } 
} 
你也有

List<Toy> toys;

如果您发布了问题评论中提到的玩具类示例,我可以进一步帮助您完成您想要完成的任务。

。。。你基本上有这样的情况

public abstract class Toy 
{ 
}

public class Submarine : Toy 
{ 
    public bool IsOccupiedByPretendPeople { get; set; } 
} 
你也有

List<Toy> toys;

如果您发布了问题评论中提到的玩具类示例,我可以进一步帮助您完成所要完成的任务。

当我们有一个继承族,并且需要使用其中一个子类型的特定功能时,我们也可以使用is操作符:下面是一个示例

公共抽象类玩具 { }


当我们有一个继承族并且需要使用其中一个子类型的特定特性时,我们也可以使用is运算符:下面是一个示例

公共抽象类玩具 { }


注意,施法不会复制物品。你可以发布你的玩具类吗?这将导致一个更好的答案。请注意,铸造不会复制该项目。你可以张贴你的玩具类?现在修改门对象也将永久修改相应的列表条目?是的。现在它是一个引擎,但是是的;现在修改门对象也将永久修改相应的列表条目?是。现在它是一个引擎,但是是的;建议使用as plus!=空检查结束。有关更多信息,请检查此处的答案:建议使用as plus!=空检查结束。有关更多信息,请在此处查看答案: