我创建了一个通用列表的子类,以便我可以实现一个新的接口
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的所有扩展方法失败。怎么回事?
答案 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();
}
}