2009-03-12 23 views
5

tôi đang cố gắng cho lần đầu tiên để tạo ra một phương pháp khuyến nông và tôi đang gặp một số rắc rối ... có lẽ các bạn có thể giúp đỡ :)biên dịch lỗi phương pháp C# mở rộng tham khảo tùy chỉnh

public static class Extentions 
    { 
     public static int myMethod(this MyClass c) 
     { 
       return 1; 
     } 
    } 

sau đó khi tôi làm "MyClass.myMethod" tôi nhận được lỗi trình biên dịch q nói rằng phương thức không tồn tại ...

Tại sao lại như vậy?

Trả lời

19

Trước tiên, bạn cần chỉ thị "sử dụng" để bao gồm không gian tên bao gồm lớp học của bạn bằng các phương pháp mở rộng.

Thứ hai - lại "MyClass.myMethod" - phương pháp khuyến nông làm việc trên trường, không phải là tĩnh - vì vậy bạn cần:

MyClass foo = ... 
int i = foo.myMethod(); // translates as: int i = Extentions.myMethod(foo); 

Cuối cùng - nếu bạn muốn sử dụng phương pháp mở rộng bên trongMyClass (hoặc một lớp con), bạn cần một rõ ràng this - tức là

int i = this.myMethod(); // translates as: int i = Extentions.myMethod(this); 

Đây là một trong số ít các trường hợp this vấn đề S.

+0

Chỉ là sự tò mò của chúng tôi, tại sao có bao giờ cần phải gọi một phương pháp mở rộng trong một lớp học?Nếu bạn đang mã hóa lớp, tại sao phương pháp này lại là phần mở rộng ở vị trí đầu tiên? Không phải nó chỉ là một phần của lớp học? (Tôi hiểu bạn đã đăng nó để hiển thị cú pháp, nhưng tôi chỉ ciurious). – BFree

+0

Lớp có thể triển khai giao diện, với phương thức mở rộng được xác định cho giao diện đó. Hoặc mã có thể nằm trong một phân lớp, với phương thức mở rộng được định nghĩa (riêng) đối với lớp cơ sở - có lẽ trong một assembly khác với lớp cơ sở. –

+0

Điều này cuối cùng; Tôi sử dụng phương pháp này để cung cấp các phần mở rộng C# 3.0/.NET 3.5 cho một thư viện chính là .NET 2.0 - tức là cho phép lambda thay vì sử dụng tên thành viên. –

6

Bạn có bao gồm không gian tên nơi tiện ích của bạn được xác định không? Tôi đã bị đốt cháy trước đó rồi.

Và một cách để giải quyết việc phải thêm không gian tên nơi tiện ích mở rộng của bạn xác định phần mở rộng trong không gian tên đó. Đây không phải là thực tiễn tốt mặc dù

5

Bạn đã nhập (using khoản ở đầu) không gian tên trong đó lớp Extensions là?

using Myself.MyProduct.MyNamespace; 
+0

Họ đang ở trong cùng một không gian tên – Sergio

1

Có lý do nào khiến bạn sử dụng Extension methods không?

Bạn chỉ nên sử dụng phương pháp mở rộng nếu bạn không thể thêm phương pháp này trong nguồn gốc và không thể mở rộng các lớp với một sub-class (nếu nó được khai báo sealed)

Trang về phương pháp mở rộng khẳng định:

Nói chung, chúng tôi khuyên bạn triển khai các phương pháp tiện ích một cách tiết kiệm và chỉ khi bạn phải làm vậy. Bất cứ khi nào có thể, mã khách hàng phải mở rộng loại hiện tại phải làm như vậy bằng cách tạo loại mới bắt nguồn từ loại hiện có. Để biết thêm thông tin, hãy xem Inheritance (C# Programming Guide).

Dưới đây là thông tin khác về classespolymorphism.

Nếu mở rộng lớp học thực sự không phải là một khả năng thì hãy làm theo các câu trả lời khác liên quan đến chỉ thị using và ví dụ methods vs static methods.

+0

Tôi cần các phương pháp mở rộng vì tôi không được phép thay đổi cụm từ cụ thể đó. – Sergio

+0

Lớp học cũng được niêm phong, ngăn cản bạn phân lớp không? –

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