我有一个基类Item。继承的类是Book。所以,一本书是一个项目。奇妙。
现在,我有一个名为Take()的方法。它对所有项目都有所体现。
它正在......
foreach (Item item in lstItems)
它也获取了我的Book对象,但只是基本成员。
当然,我无法从中获取本书的特定属性。由于并非所有物品都是书籍,我不想每次都将物品投放到书本上。
是否有一种通过C#在foreach中获取继承类的常用方法?
答案 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
继承。