C# 代替过滤器铸造的预制件类型

C# 代替过滤器铸造的预制件类型,c#,ienumerable,oftype,C#,Ienumerable,Oftype,假设在我的数据库中有两个类:Class FooBar和Class BarFoo。我在我的数据库上执行一个查询,返回类FooBos,该类包含FooBar的列表,但该列表可以包含BarFoo的实例(不要问我为什么,这是我获取数据库的方式,我无法编辑它) 无论如何,为了构建我的域对象,我使用以下代码检查哪个类是哪个类 if(FooBos.FooBars.OfType<BarFoo>().Count() != 0) //Do things for FooBar here else /

假设在我的数据库中有两个类:Class FooBar和Class BarFoo。我在我的数据库上执行一个查询,返回类FooBos,该类包含FooBar的列表,但该列表可以包含BarFoo的实例(不要问我为什么,这是我获取数据库的方式,我无法编辑它)

无论如何,为了构建我的域对象,我使用以下代码检查哪个类是哪个类

if(FooBos.FooBars.OfType<BarFoo>().Count() != 0)
  //Do things for FooBar here
else
  //Do Things for BarFoo here
if(FooBos.FooBars.OfType().Count()!=0)
//在这里为FooBar做事
其他的
//在这里为巴福做事
所以问题是在of类型之后,整个列表都是BarFoo类型的,我似乎不明白为什么

有人知道为什么会发生这种情况吗?

通常,只要存在继承关系,就会使用类型为的
。在你的情况下,我怀疑FooBar是BarFoo的孩子


如果是这种情况,则表示列表中的所有对象要么继承BarFoo,要么只是BarFoo对象;所以类型的
返回所有对象。

如果不介意迭代两次(使用Linq),可以使用两个单独的语句:

foreach (BarFoo barfoo in FooBos.FooBars.OfType<BarFoo>()
    // Do something with barfoo

foreach (FooBar foobar in FooBos.Foobars.OfType<FooBar>()
    // Do something with foobar

OfType
用于迭代列表,并仅选择可转换为目标类型的类型,其余类型仅被跳过。查看计数是否不为零并不表明整个列表仅包含该类型。看起来你的if语句是反的,至少你的评论是反的。我建议你使用比Bar和Foo更清晰的名称,这让人困惑。OfType也只过滤给定类型的元素,因此只获取
BarFoo
的项对我来说似乎是合乎逻辑的。@Abbas是的,我知道,但强制转换发生在整个列表上,甚至是FooBar:)我现在这样做是为了避免强制转换。大致相同,但daryal是对的,因为类之间存在继承
foreach (var entry in FooBos.FooBars)
{
    BarFoo barfoo = entry as BarFoo;

    if (barfoo != null)
    {
        // Do something with barfoo
    }
    else
    {
        FooBar foobar = entry as FooBar;

        if (foobar != null)
        {
            // Do something with foobar
        }
    }
}