多态运行时对象类型检查

and*_*ert 1 c# polymorphism

考虑以下类:

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"; } }
}
Run Code Online (Sandbox Code Playgroud)

并且列表包含两个类型为B的对象和一个类型为C的对象:

List<A> l = new List<A>();
l.Add(new B());
l.Add(new C());
l.Add(new B());
Run Code Online (Sandbox Code Playgroud)

是否有某种方法可以在运行时强制检查类型,并仅在此列表中对类型B的对象进行迭代(缺少编写列表的自定义实现)?就像是:

foreach (B obj in l)               // runtime error
    Console.WriteLine(obj.Name);

// desired output:
//   B
//   B
Run Code Online (Sandbox Code Playgroud)

我没有在一个项目中遇到过这个问题,但这个想法刚刚发生在我身上,我很好奇是否可以做到这一点.我知道这个功能的需要可能表明存在设计缺陷.

Jas*_*zun 7

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

foreach (B obj in l.OfType<B>())
    Console.WriteLine(obj.Name);
Run Code Online (Sandbox Code Playgroud)

如果 想要Bs,而不是B列出任何子类,可以使用以下命令:

foreach (B obj in l.Where(o => o.GetType() == typeof(B)))
    Console.WriteLine(obj.Name);
Run Code Online (Sandbox Code Playgroud)