2009-08-01 35 views
6

Tôi hiện đang có một phương pháp khuyến nông trên System.Windows.Forms.Control như thế này:C#: Thêm phương pháp khuyến nông để một lớp cơ sở để họ xuất hiện trong các lớp thừa kế

public static void ExampleMethod(this Control ctrl){ /* ... */ } 

Tuy nhiên, phương pháp này không xuất hiện trên các lớp có nguồn gốc từ Control, chẳng hạn như PictureBox. Tôi có thể làm cho một phương pháp mở rộng xuất hiện không chỉ trong điều khiển, nhưng đối với các lớp học có nguồn gốc từ kiểm soát, mà không cần phải làm một diễn viên rõ ràng?

+0

Bản sao có thể có của [Tại sao tôi không thể gọi một phương thức mở rộng từ một lớp cơ sở của loại mở rộng?] (Http://stackoverflow.com/questions/27883427/why-cant-i-call-an- extension-method-from-a-base-class-of-the-mở rộng-type) –

Trả lời

13

Bạn phải bao gồm câu lệnh sử dụng cho không gian tên trong đó lớp tiện ích của bạn được xác định hoặc các phương pháp mở rộng sẽ không nằm trong phạm vi.

Phương pháp mở rộng hoạt động tốt trên các loại có nguồn gốc (ví dụ: phương pháp mở rộng được xác định trên IEnumerable<T> trong System.Linq).

+0

Cảm ơn bạn! Nó được định nghĩa trong một không gian tên khác, thêm một câu lệnh sử dụng đã sửa nó. – MiffTheFox

+0

Không gian tên và Phạm vi nơi các từ khóa đã giúp tôi ở đây. Cảm ơn bạn! – GregoryBrad

8

Một phương pháp mở rộng sẽ thực sự áp dụng cho tất cả những người thừa kế/người triển khai thuộc loại đang được mở rộng (trong trường hợp này là Kiểm soát). Bạn có thể thử kiểm tra các câu lệnh bằng cách sử dụng để đảm bảo không gian tên mà phương thức mở rộng đang được tham chiếu nơi bạn đang cố gắng gọi nó.

-2

Tôi nghĩ rằng bạn cần phải thực hiện việc gia hạn chung:

public static void ExampleMethod<T>(this T ctrl) 
    where T : Control 
{ /* ... */ } 

Không, bạn không cần phải .. nó cũng sẽ làm việc với phiên bản không-generic bạn được đăng, hãy nhớ để thêm không gian tên cho tiện ích mở rộng của bạn.

1

Bạn cũng có thể đảm bảo tiện ích của mình không được xác định trong không gian tên, khi đó bất kỳ dự án nào tham chiếu đến chúng đều sẽ tự động nhập chúng.

0

Note rằng nếu bạn gọi một phương pháp mở rộng từ một tài sản trong lớp mà kế thừa từ một lớp cơ sở có phương pháp mở rộng áp dụng cho nó, bạn phải hậu tố các phương pháp khuyến nông với this

ví dụ

public int Value 
{ 
    get => this.GetValue<int>(ValueProperty); 
    set => SetValue(ValueProperty, value); 
} 

Ở đâu GetValue là phương pháp mở rộng của tôi được áp dụng cho lớp cơ sở.

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