2010-06-24 27 views
5

Tôi đã tạo ra một lớp con của một danh sách chung để tôi có thể thực hiện một giao diện mớisubclassing Danh sách <T> doesnt giữ lại danh sách chức năng

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

Khi tôi thay đổi định nghĩa lĩnh vực đến lớp mới (xem ví dụ về già và dòng mới bên dưới) Tôi nhận được tất cả các loại lỗi biên dịch về những thứ sẽ tồn tại trong danh sách gốc.

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

Tại sao CustomersCollection không kế thừa triển khai giao diện IQueryable, IEnumerable cho Danh sách?

Các lỗi chính thức là:

'CustomersCollection' không chứa một định nghĩa cho 'ở đâu' và không có phương pháp mở rộng 'ở đâu' chấp nhận một đối số đầu tiên loại 'CustomersCollection' có thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc tham khảo một hội?)


Nó chỉ ra rằng việc thực hiện tùy chỉnh của IEnumerable gây ra tất cả các phương pháp mở rộng áp dụng cho IEnumerable để thất bại. Những gì đang xảy ra ở đây?

+0

Bạn có chắc chắn nó làm cho bất kỳ loại cảm giác ở tất cả để kế thừa từ một lớp mà thực hiện 'IEnumerable ' nhưng ghi đè này để thực hiện 'IEnumerable < SqlDataRecord> '? Nó sẽ không được tốt hơn để chỉ cần thêm một phương thức trả về 'IEnumerable ' để tránh những điều phức tạp? –

Trả lời

11

Phương thức mở rộng có sẵn cho một lớp kế thừa từ List<T>. Có lẽ bạn cần thêm using System.Linq; vào tệp mã của mình? Ngoài ra, hãy kiểm tra xem bạn có tham chiếu đến System.Core.dll hay không.

Sửa

Vì bạn có List<U>IEnumerable<T> được thừa hưởng/thực hiện bởi cùng lớp, bạn cần phải cung cấp các loại khi bạn sử dụng các phương pháp khuyến nông. Ví dụ:

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

... dựa trên

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

+1 .... 'Where' không phải là" kế thừa "từ bất cứ điều gì, đó là một phương pháp mở rộng. –

+0

'Where' không được kế thừa, nhưng nó yêu cầu thực hiện' IEnumerable', mà ở đây được cung cấp thông qua kế thừa. Đồng ý rằng 'CustomerCollection' có mọi thứ cần thiết để sử dụng trong LINQ. –

+0

Cảm ơn bạn đã trả lời, nhưng đó không phải là giải pháp. Mã này đang hoạt động với Danh sách . Ngay sau khi tôi thay đổi nó thành CustomerCollection, mã không biên dịch được. Không có tham chiếu bị thiếu hoặc nhập vùng tên. Đó là lý do tại sao tôi bối rối. –

Các vấn đề liên quan