2011-07-31 45 views
5

Tôi đang cố gắng mở rộng lớp Trang để thêm một số chức năng mới (dễ sử dụng cho một số phương thức vì chúng sẽ được gọi trực tiếp trong mã của trang đó) trong ASP.NET và tôi ' m nhận được một lỗi lạ:Vấn đề phương thức mở rộng lạ với thừa kế

phương pháp của tôi được gọi SetQuery,
nếu tôi gõ SetQuery trong trang một lớp học, nó không được công nhận (vâng, tôi đã thêm using [Namespace];),
nếu tôi gõ base.SetQuery nó được xem trong IntelliSense, nhưng không biên dịch nói rằng không có phương pháp hoặc phương pháp mở rộng nào thực sự được tìm thấy trong Trang,
nếu tôi nhập (this as Page).SetQuery nó được công nhận và hoạt động.

Đặc biệt trường hợp thứ hai có vẻ là một lỗi đối với tôi, vì IntelliSense nhận ra nó là một phương pháp mở rộng, nhưng không biên dịch.

Có cách nào 'tự nhiên hơn' để nhập SetQuery khi tôi đi, không có phôi, v.v. không?

Trả lời

9

Phương pháp mở rộng luôn luôn yêu cầu đối tượng đích (rõ ràng), vì vậy không thể gọi phương thức mở rộng chỉ qua TheMethodName(). Tôi nghi ngờ rằng nếu bạn nhập:

this.SetQuery(); 

nó sẽ hoạt động. Có không bao giờ một ẩn ngụ this. với các phương pháp mở rộng. Odd nhưng đúng.

Ở trên giải thích lý do tại sao SetQuery() không hoạt động; base.SetQuery() sẽ không hoạt động vì phương thức mở rộng được xác định cho Page, không phải cho lớp cơ sở. (this as Page).SetQuery() sẽ hoạt động với cùng một lý do như this.SetQuery() và thực tế vì this as Page rõ ràng là đúng, trình biên dịch sẽ coi như là không có - nghĩa là this.SetQuery()(this as Page).SetQuery() nên tạo cùng một IL (miễn là trang thực tế không có phương thức cụ thể hơn là SetQuery(), rõ ràng).

+0

Tôi hiểu, tôi nghĩ rằng mặc dù tôi đã hoàn toàn sử dụng các phương pháp mở rộng, tôi chưa bao giờ gọi chúng trong chính lớp đó. Nhưng nó vẫn có vẻ là một lỗi với tôi rằng intellisense cho thấy phương pháp, nhưng nó không biên dịch khi tôi viết nó/chọn nó từ intellisense, phàn nàn rằng nó không được tìm thấy. –

+0

@can yes, mà vết thương giống như một lỗi intellisense - đã đồng ý –

+0

FYI: Đó chỉ dành cho C#. Trong VB, bạn có thể sử dụng ngầm định này. –

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