考虑以下课程:
class A
{
public virtual string Name { get { return "A"; } }
}
class B : A
{
public override string Name { get { return "B"; } }
}
class C : A
{
public override string Name { get { return "C"; } }
}
包含两个B类对象和一个C类对象的列表:
List<A> l = new List<A>();
l.Add(new B());
l.Add(new C());
l.Add(new B());
是否有某种方法可以在运行时强制检查类型,并且只对此列表中类型B的对象进行迭代(缺少编写列表的自定义实现)?类似的东西:
foreach (B obj in l) // runtime error
Console.WriteLine(obj.Name);
// desired output:
// B
// B
我还没有在一个项目中遇到这个问题,但这个想法刚刚发生在我身上,我很好奇是否可以做到这一点。我知道这个功能的需要可能表明存在设计缺陷。
答案 0 :(得分:7)
您可以使用.OfType<T>()
:
foreach (B obj in l.OfType<B>())
Console.WriteLine(obj.Name);
如果您只想要 B
,而不是列出B
的任何子类,则可以使用以下内容:
foreach (B obj in l.Where(o => o.GetType() == typeof(B)))
Console.WriteLine(obj.Name);
答案 1 :(得分:3)
foreach (A obj in l)
{
if (obj is B)
{
Console.WriteLine(obj.Name);
}
}