【问题标题】:How to use foreach with inherited classes?如何将 foreach 与继承的类一起使用?
【发布时间】:2014-06-07 10:37:00
【问题描述】:

我有一个 Item 的基类。继承的类是 Book。所以,一本书是一件物品。太棒了。

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

它正在做......

foreach (Item item in lstItems)

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

当然,我无法从中获取 Book 的特定属性。由于并非所有项目都是书,我不想每次都将项目投射到书。

有没有一种通用的方法可以使用 C# 在 foreach 中获取继承的类?

【问题讨论】:

    标签: c# foreach casting


    【解决方案1】:

    如果列表中有 A(或其他不是 B 或 B 的子类的东西),

    然后它会简单地因无效转换而中断。你可能想要:

    foreach(B i in lstItems.OfType<B>()) {...}
    

    在 .NET 3.5 中。 (我假设lstItems 本身是非空的,顺便说一句。)

    【讨论】:

    • 也可以使用var作为变量类型(我通常这样做):foreach(var i in lstItems.OfType&lt;B&gt;()) ..
    • @chue x,感谢您的帮助。在实现这一点后,我执行了“foreach(lstItems.OfType()) 中的项目项”,但它仍然选择了 Book,因为它仍然是其基础的项目。它仅在我有两个相反顺序的 foreachs 时才起作用,即。我先找了B型。如果找到这本书,我们就完成了。如果没有找到,它会为 A 类型启动一个 foreach。它仍然有效,但我必须按照相反的顺序(B,然后 A)而不是(A,然后 B),因为 B 无论如何都是 A 类型。我想这是有道理的。
    【解决方案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 继承。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2014-03-03
      • 1970-01-01
      • 2018-04-24
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多