Получить список записей определенного подтипа с помощью LINQ
У меня есть три класса: Foo, Bar и Baz. Bar и Baz расширяют Foo, что является абстрактным. У меня есть список типа Foo, заполненный барами и базами. Я хочу использовать предложение LINQ Where, чтобы вернуть все одного типа. Что-то вроде:
class Bar : Foo
{
public Bar()
{
}
}
class Baz : Foo
{
public Baz()
{
}
}
List<Foo> foos = new List<Foo>() { bar1, bar2, foo1, foo2, bar3 };
List<Bar> bars;
bars = (List<Bar>)foos.Where(o => o.GetType() == Type.GetType("Bar"));
Когда я делаю это, я получаю сообщение об ошибке: Дополнительная информация: Невозможно привести объект типа 'WhereListIterator1[Foo]' to type 'System.Collections.Generic.List
1 [бар].
1 ответ
Решение
Попробуйте OfType (): отфильтровать Bar
предметы и материализуйте их в список:
List<Bar> bars = foos
.OfType<Bar>()
.ToList();
Редактировать: если вы хотите Bar
только экземпляры, но не Baz
даже если / когда Baz
происходит от Bar
Вы должны добавить условие:
List<Bar> bars = foos
.OfType<Bar>()
.Where(item => item.GetType() == typeof(Bar)) // Bar only
.ToList();