Список подклассов <T>не сохраняет функциональность списков - PullRequest
5 голосов
/ 24 июня 2010

Я создал подкласс общего списка, чтобы я мог реализовать новый интерфейс

public class CustomersCollection : List<Customer>, IEnumerable<SqlDataRecord>
{
...
}

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

public CustomersCollection Customers { get; set; } 
public void Sample()
{
    Console.WriteLine(Customers.Where(x=>x.condition).First().ToString());
}

Почему CustomersCollection не наследует реализации интерфейса IQueryable, IEnumerable для List?

Официальная ошибка:

'CustomersCollection' не содержитможно найти определение для «Где» и без метода расширения «Где», принимающего первый аргумент типа «CustomersCollection» (отсутствует директива using или ссылка на сборку?)


Оказывается, что пользовательская реализация IEnumerable вызывает сбой всех методов расширения, которые применяются к IEnumerable.Что здесь происходит?

1 Ответ

11 голосов
/ 24 июня 2010

Методы расширения доступны для класса, который наследуется от List<T>. Возможно, вам нужно добавить using System.Linq; в ваш файл кода? Также убедитесь, что у вас есть ссылка на System.Core.dll.

Редактировать

Поскольку List<U> и IEnumerable<T> наследуются / реализуются одним и тем же классом, вам необходимо указать тип при использовании методов расширения. Пример:

CustomerCollection customers = new CustomerCollection();
customers.Add(new Customer() { Name = "Adam" });
customers.Add(new Customer() { Name = "Bonita" });
foreach (Customer c in customers.Where<Customer>(c => c.Name == "Adam"))
{
    Console.WriteLine(c.Name);
}

... на основании

class Customer { public string Name { get; set; } }    

class Foo { }

class CustomerCollection : List<Customer>, IEnumerable<Foo>
{
    private IList<Foo> foos = new List<Foo>();

    public new IEnumerator<Foo> GetEnumerator()
    {
        return foos.GetEnumerator();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...