多态运行时对象类型检查

时间:2015-08-03 16:55:02

标签: 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"; } }
}

包含两个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

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

2 个答案:

答案 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);
    }

}