c # возвращая реализацию класса в лямбде - PullRequest
0 голосов
/ 05 мая 2019

С примером, который у меня есть:

public class A
{
    public string ID { get; set; }
}
public class B : A
{
    public string name { get; set; }
}

Можно ли вернуть список класса A в класс B по лямбде, не используя никаких расширений класса? Мне интересно, способен ли нынешний фреймворк сделать это или нет.

public void Something()
{
    List<A> objA = new List<A>();
    List<B> objB = new List<B>();
    objB = objA.Where(x => x.ID == "").ToList();
}

Предположительно, класс B является реализацией класса A. Почему этот код будет возвращать ошибку

Невозможно неявно преобразовать 'System.Collection.Generic.List A>' в System.Collection.Generic.List B>

1 Ответ

1 голос
/ 05 мая 2019

objA может содержать объекты класса A или B, поэтому вы не можете напрямую присвоить результат вашего запроса objB.

Если вы уверены, что каждый объект, передающий Where, на самом деле является объектом класса B, вы можете написать:

objB = objA.Where(x => x.ID == "").Cast<B>().ToList();

Это приводит к тому, что каждый объект вставляет объект Where в B, поэтому вы получаете IEnumerable<B>, который превращается в List<B> при вызове ToList.

Если также объекты типа A могут проходить через Where, при использовании OfType вместо Cast используются только те объекты, которые относятся к типу B:

objB = objA.Where(x => x.ID == "").OfType<B>().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...