多态运行时对象类型检查
本文关键字:检查 类型 对象 运行时 多态 | 更新日期: 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);
}
}