Бросить/Преобразовать IEnumerable <T> к IEnumerable <U>?

Так как вопрос не определил.NET, это должно работать в VBScript или VB6.

Dim objFSO, strFolder
strFolder = "C:\Temp"
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExists(strFolder) Then
   objFSO.CreateFolder(strFolder)
End If
12
задан TrueWill 21 November 2009 в 18:35
поделиться

6 ответов

Вы не можете преобразовать, потому что это разные типы. У вас есть два варианта:

1) Измените класс так, чтобы PersonWithAge наследовал от person.

class PersonWithAge : Person
{
        public int Age { get; set; }
}

2) Создайте новые объекты:

IEnumerable<Person> p = pwa.Select(p => new Person { Id = p.Id, Name = p.Name });
18
ответ дан 2 December 2019 в 04:17
поделиться

Используйте Выберите вместо Cast , чтобы указать, как выполнять преобразование из одного типа в другой:

IEnumerable<Person> p = pwa.Select(x => new Person { Id = x.Id, Name = x.Name });

Также как PersonWithAge всегда будет содержать те же свойства, что и Person , плюс еще пара, было бы лучше унаследовать его от Person .

8
ответ дан 2 December 2019 в 04:17
поделиться

Вы не можете просто преобразовать два несвязанных типа друг в друга. Вы можете сделать возможным преобразование PersonWithAge в Person, разрешив PersonWithAge наследовать от Person. Поскольку PersonWithAge, очевидно, является частным случаем Person, это имеет большой смысл:

class Person
{
        public int Id { get; set; }
        public string Name { get; set; }
}

class PersonWithAge : Person
{
        // Id and Name are inherited from Person

        public int Age { get; set; }
}

Теперь, если у вас есть IEnumerable с именем peopleWithAge , то peopleWithAge. Cast () будет работать.

В VS 2010 вы даже сможете полностью пропустить приведение типов и сделать (IEnumerable ) peopleWithAge , поскольку IEnumerable ковариантен в .NET 4.

4
ответ дан 2 December 2019 в 04:17
поделиться

Сделать PersonWithAge наследованием от Person.

] Примерно так:

class PersonWithAge : Person
{
        public int Age { get; set; }
}
3
ответ дан 2 December 2019 в 04:17
поделиться

Вы можете сохранить IEnumerable и не преобразовывать его в IEnumerable . Просто добавьте неявное преобразование, чтобы преобразовать объект PersonWithAge в Person , когда вам нужно.

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public static implicit operator Person(PersonWithAge p)
    {
        return new Person() { Id = p.Id, Name = p.Name };
    }
}

List<PersonWithAge> pwa = new List<PersonWithAge>
Person p = pwa[0];
1
ответ дан 2 December 2019 в 04:17
поделиться

вы можете захотеть изменить свой код, чтобы он выглядел примерно так:

class Person
{
        public int Id { get; set; }
        public string Name { get; set; }
}

class PersonWithAge : Person
{
        public int Age { get; set; }
}
1
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: