考虑以下类:
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)
我没有在一个项目中遇到过这个问题,但这个想法刚刚发生在我身上,我很好奇是否可以做到这一点.我知道这个功能的需要可能表明存在设计缺陷.
你可以使用.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)
| 归档时间: |
|
| 查看次数: |
807 次 |
| 最近记录: |