C # бросить объект в список базового класса - PullRequest
5 голосов
/ 11 ноября 2011

У меня следующая структура класса:

public class Fruit { }
public class Apple : Fruit { }

И затем я использую метод из .net framework, который возвращает мне значение свойства из класса, возвращаемого как объект. Итак,

// values will be of type List<Apple>
object values = someObject.GetValue()

Теперь у меня есть этот объект значений типа List, и я хочу привести его к списку типа Fruit. Я попробовал следующее, но это не сработало.

List<Fruit> fruits = values as List<Fruit>;

Кто-нибудь знает, как выполнить приведение объекта к списку его базового класса?

Обновление: в момент приведения я не знаю, что объект значений имеет тип List, я просто знаю, что это должен быть список типа, который наследуется от Fruit.

Ответы [ 3 ]

5 голосов
/ 11 ноября 2011

Проблема в том, что List<Apple> и List<Fruit> не являются ко-вариантами.Сначала вам нужно привести к List<Apple>, а затем использовать метод Cast LINQ для приведения элементов к Fruit:

List<Fruit> fruits = values is List<Apple> ? 
    (values as List<Apple>).Cast<Fruit>().ToList() :
    new List<Fruit>();

Если вы не знаете тип заранее и выне нужно изменять список (и вы используете C # 4.0), вы можете попробовать:

IEnumerable<Fruit> fruits = values as IEnumerable<Fruit>;

Или, я думаю, если вам нужен список:

List<Fruit> fruits = (values as IEnumerable<Fruit>).ToList();
2 голосов
/ 11 ноября 2011

вы должны попробовать метод приведения linq . метод Cast возвращает IEnumerable того типа, к которому вы приводите ...

   List<Fruit> fruits = null;
   if ( values is List<Apples> ) 
     fruits = ((List<Apples>)values).Cast< fruits >.ToList();
1 голос
/ 11 ноября 2011

Поскольку вы говорите, что знаете, что объект представляет собой список фруктов, но вы не знаете, к какому фрукту это список, вы можете сделать следующее:

List<Fruit> fruits = ((IEnumerable)values).Cast<Fruit>().ToList();

Если вы используете .NET 4 (исключая Silverlight 4), вы можете использовать решение Джастина Нисснера:

List<Fruit> fruits = ((IEnumerable<Fruit>)values).ToList();

Наконец, возможно, будет возможно использовать универсальное решение, если есть сайт вызова, где известен статический тип фрукта (Apple или что-то еще). Это значило бы немного изменить код, чтобы вы больше не получали значения с помощью отражения.

Другим общим подходом было бы создание универсального метода и его создание во время выполнения с помощью вызова GetType () для объекта, но это, вероятно, случай излечения хуже, чем болезнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...