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

时间:2015-02-13 22:11:17

标签: c# list inheritance

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

List <Toy> toys;

Toy是一个抽象类,CarSubmarine等类派生自它。该列表当然可以包含Toy类型的任何对象。由于我缺乏C#的经验,我不知道如何修改此列表中的对象,i。即更改特定于类型的属性。编译器只知道列表包含Toy个对象,并且无法访问Submarine对象的字段。所以我不能简单地从列表中取一些元素,调用一个setter并完成它。转换只会获得转换为某种类型的列表对象的副本。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

如果您对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;
    }
}

或者您可以使用'switch'语句和一些演员,这可能更具可读性:

foreach (var toy in toys)
{
    switch (toy.GetType().Name)
    {
        case "Car":
            ((Car) toy).Color = Color.Blue;
            break;
        case "Elephant":
            var elephant = toy as Elephant;
            elephant.TrunkLength = 48;
            elephant.Manufacturer = "Made in China";
            break;
    }
}

答案 1 :(得分:1)

你必须投射物品:

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

答案 2 :(得分:1)

所以......你基本上有这样的情况吗?

public abstract class Toy 
{ 
}

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

你也有

List<Toy> toys;

您想获得Submarine类的所有实例吗?

这应该可以解决问题:

IEnumerable<Submarine> submarines = toys.OfType<Submarine>();

如果您发布了Toy课程的示例(如您的问题评论中所述),我可以进一步帮助您完成您想要完成的课程。

答案 3 :(得分:1)

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

公共抽象类玩具     {     }

public class Submarine : Toy
{
}

public class Airwolf : Toy
{

    public Boolean ActivateMissiles()
    {
        return true;
    }

}
class Program
{
    static void Main(string[] args)
    {
        List<Toy> myToys = new List<Toy>();
        myToys.Add(new Submarine());
        myToys.Add(new Airwolf());

        // Looking for airwolves
        foreach (Toy t in myToys)
        {
            if (t is Airwolf)
            {
                Airwolf myWolf = (Airwolf)t;
                myWolf.ActivateMissiles();
            }
        }
    }
}