Subclassing List <T>不保留列表功能

Mat*_*ell 5 c# inheritance

我创建了一个通用列表的子类,以便我可以实现一个新的接口

public class CustomersCollection : List<Customer>, IEnumerable<SqlDataRecord>
{
...
}
Run Code Online (Sandbox Code Playgroud)

当我将字段定义更改为新类时(请参阅下面的旧行和新行的示例),我会在原始列表中应该存在的内容上获得各种编译错误.

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

为什么CustomersCollection不继承List的IQueryable,IEnumerable接口实现?

官方错误是:

'CustomersCollection'不包含'Where'的定义,也没有扩展方法'Where'可以找到接受'CustomersCollection'类型的第一个参数(你是否缺少using指令或汇编引用?)


事实证明,IEnumerable的自定义实现会导致适用于IEnumerable的所有扩展方法失败.这里发生了什么?

Ant*_*ram 11

扩展方法适用于从继承的类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);
}
Run Code Online (Sandbox Code Playgroud)

... 基于

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();
    }
}
Run Code Online (Sandbox Code Playgroud)