C# 代替过滤器铸造的预制件类型
假设在我的数据库中有两个类:Class FooBar和Class BarFoo。我在我的数据库上执行一个查询,返回类FooBos,该类包含FooBar的列表,但该列表可以包含BarFoo的实例(不要问我为什么,这是我获取数据库的方式,我无法编辑它) 无论如何,为了构建我的域对象,我使用以下代码检查哪个类是哪个类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 /
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
}
}
}