遍历不同类型的列表
Iterating through a list with a different type
我在尝试使用不同类型遍历列表时遇到了一些不寻常的事情。我在下面有一些示例代码。
我正在使用两个接口:
interface IViewable
{
void View();
}
interface IHideable
{
void Hide();
}
以及以下 类:
class AwesomeClass : IViewable, IHideable
{
public void Hide()
{
Console.WriteLine("Le hiding.");
}
public void View()
{
Console.WriteLine("Le toucan has arrived.");
}
}
class LessAwesomeClass : IViewable
{
public void View()
{
Console.WriteLine("Le arrival.");
}
}
注意:LessAwesomeClass 不 继承 IHideable
这是一个使用这些的示例控制台应用程序:
static void Main(string[] args)
{
List<IViewable> viewable = new List<IViewable>();
viewable.Add(new AwesomeClass());
viewable.Add(new LessAwesomeClass());
//This runs fine.
foreach (IViewable view in viewable)
view.View();
//Oh no! InvalidCastException
foreach (IHideable hidable in viewable)
hidable.Hide();
Console.Read();
}
当尝试遍历类型为 IHideable
的列表时,它会抛出 InvalidCastException。这是有道理的,因为它显然是在尝试将项目转换为 IHideable
。我明白了。
现在这里的问题是应用程序编译。我觉得有点奇怪。
这就是让我感到困惑的地方,因为我正在写这篇文章并且在想,"Hey! I can do a for each loop for IHideable and filter out anything that isn't IHideable, great! Oh wait, InvalidCastException."
所以第一个问题是为什么编译?
第二个问题,在执行 foreach 循环时,有没有办法 过滤掉 不是 IHideable
的所有内容?
无论如何,这样做可能不是一个好主意,这更像是一种 "I wonder if this will work" 情况。
why does this compile?
Is there a way to filter out everything that isn't IHideable when
doing a foreach loop?
是,使用 OfType 扩展方法。
foreach (IHideable hidable in viewable.OfType<IHideable>())
hidable.Hide();
我在尝试使用不同类型遍历列表时遇到了一些不寻常的事情。我在下面有一些示例代码。
我正在使用两个接口:
interface IViewable
{
void View();
}
interface IHideable
{
void Hide();
}
以及以下 类:
class AwesomeClass : IViewable, IHideable
{
public void Hide()
{
Console.WriteLine("Le hiding.");
}
public void View()
{
Console.WriteLine("Le toucan has arrived.");
}
}
class LessAwesomeClass : IViewable
{
public void View()
{
Console.WriteLine("Le arrival.");
}
}
注意:LessAwesomeClass 不 继承 IHideable
这是一个使用这些的示例控制台应用程序:
static void Main(string[] args)
{
List<IViewable> viewable = new List<IViewable>();
viewable.Add(new AwesomeClass());
viewable.Add(new LessAwesomeClass());
//This runs fine.
foreach (IViewable view in viewable)
view.View();
//Oh no! InvalidCastException
foreach (IHideable hidable in viewable)
hidable.Hide();
Console.Read();
}
当尝试遍历类型为 IHideable
的列表时,它会抛出 InvalidCastException。这是有道理的,因为它显然是在尝试将项目转换为 IHideable
。我明白了。
现在这里的问题是应用程序编译。我觉得有点奇怪。
这就是让我感到困惑的地方,因为我正在写这篇文章并且在想,"Hey! I can do a for each loop for IHideable and filter out anything that isn't IHideable, great! Oh wait, InvalidCastException."
所以第一个问题是为什么编译?
第二个问题,在执行 foreach 循环时,有没有办法 过滤掉 不是 IHideable
的所有内容?
无论如何,这样做可能不是一个好主意,这更像是一种 "I wonder if this will work" 情况。
why does this compile?
Is there a way to filter out everything that isn't IHideable when doing a foreach loop?
是,使用 OfType 扩展方法。
foreach (IHideable hidable in viewable.OfType<IHideable>())
hidable.Hide();