多态运行时对象类型检查

本文关键字:检查 类型 对象 运行时 多态 | 更新日期: 2023-09-27 18:06:20

考虑以下类:

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

我在项目中没有遇到过这个问题,但是这个想法突然出现在我身上,我很好奇这是否可以做到。我知道需要这个功能可能意味着一个设计缺陷。

多态运行时对象类型检查

您可以使用.OfType<T>():

foreach (B obj in l.OfType<B>())
    Console.WriteLine(obj.Name);

如果您希望只列出 B s,而不列出B的任何子类,您可以使用以下命令:

foreach (B obj in l.Where(o => o.GetType() == typeof(B)))
    Console.WriteLine(obj.Name);
foreach (A obj in l) 
{
    if (obj is B)
    {
       Console.WriteLine(obj.Name);
    }
}