Использование метода Select () в списке - PullRequest
1 голос
/ 16 декабря 2011

Я использую ListView для отображения коллекции элементов, и я назначаю эти элементы следующим образом:

page.Items = _sampleData.Cats.Select(obj => (object) obj);

Это прекрасно работает, каждый Cat отображается в списке,Воспроизводимо, если я удаляю приведение (object) и назначаю Предметы, используя

page.Items = _sampleData.Cats.Select(obj => obj);

или

page.Items = _sampleData.Cats;

Тогда вместо правильного хранения данных, children из first Cat вместо этого отображаются в списке.Это кажется ... не интуитивным?Есть ли какой-то крайний случай, который я поражаю в своем коде, который работает по-другому, если Items явно не object s, или это приведение действительно имеет значение?

Редактировать: Дополнительный код.

Cats - это список Cat объектов:

public class Cat : IEnumerable<Trait>, IEnumerable
{
    public String Name;
    // getter and setter

    public List<Trait> Traits;
    // getter and setter

    public IEnumerator<Trait> GetEnumerator() {
        return Traits.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

* ListView является компонентом Metro UI:

<ListView x:Name="CatListView" ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" ...>

И данные предоставляются ListView через установщик для Items в одном из моих классов:

private IEnumerable<object> _items;
public IEnumerable<object> Items
{
    get
    {
        return _items;
    }

    set
    {
        _items = value;
        CollectionViewSource.Source = value;
    }
}

1 Ответ

3 голосов
/ 16 декабря 2011

Более простой способ выполнить то, что вы делаете, это использовать Cast <> () :

page.Items = _sampleData.Cats.Cast<object>();

(Оригинальный ответ ниже, который не так действителен после всех комментариев).

Это потому, что вы не можете назначить коллекцию производного класса коллекции базового класса.

Давайте возьмем LINQ из уравнения. page.Items относится к типу List<object>. Предположим, что скомпилируется следующее (это не так):

page.Items = _sampleData.Cats;

Затем обратите внимание, что совершенно правильно помещать все, что наследуется от object в List<object>. Но , в данном случае наш список объектов действительно является списком Cat.

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

var b = new Banana();
page.Items.Add(b);

Вы не можете поместить Banana в List<Cat>.

...