子类列表<t>不保留列表功能</t>

时间:2010-06-24 14:32:40

标签: c# inheritance

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

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不继承List的IQueryable,IEnumerable接口实现?

官方错误是:

  

'CustomersCollection'不包含   'Where'和no的定义   扩展方法'在哪里'接受a   类型的第一个参数   'customersCollection'可以找到   (你错过了使用指令或   汇编参考?)


事实证明,IEnumerable的自定义实现会导致适用于IEnumerable的所有扩展方法失败。怎么回事?

1 个答案:

答案 0 :(得分: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);
}

......基于

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();
    }
}