如何使用foreach继承类?

时间:2014-06-07 02:16:17

标签: c# foreach casting

我有一个基类Item。继承的类是Book。所以,一本书是一个项目。奇妙。

现在,我有一个名为Take()的方法。它对所有项目都有所体现。

它正在......

foreach (Item item in lstItems)

它也获取了我的Book对象,但只是基本成员。

当然,我无法从中获取本书的特定属性。由于并非所有物品都是书籍,我不想每次都将物品投放到书本上。

是否有一种通过C#在foreach中获取继承类的常用方法?

2 个答案:

答案 0 :(得分:4)

如果列表中有A(或其他非B或B的子类),

那么它只会破坏无效的演员表。你可能想要:

foreach(B i in lstItems.OfType<B>()) {...}
在.NET 3.5中

。 (我假设lstItems本身是非空的,顺便说一下。)

答案 1 :(得分:2)

要完成其他答案(即有许多方法可以投射东西),在处理继承时通常不必使用任何形式的强制转换。更多,继承的确切目标是处理多态类型。

您应该提供多态方法,这些方法在逻辑上对您的层次结构的每个类都起作用。

例如,提供一个Execute()方法,该方法在基类中不执行任何操作,并Book正确覆盖。

public class Item
{
    public virtual void Execute() {}
}

public class Book : Item
{
    public override void Execute() { Console.WriteLine("I'm a book"); }
}

public class Test
{
    public static void Main()
    {
        List<Item> items = new List<Item> { new Item() , new Item() , new Book(), new Book() };
        foreach(var item in items)
            item.Execute();
    }
}

如果这不适合你,那么Book可能不应该首先从Item继承。