2012-11-23 28 views
17

thể trùng lặp:
Is there any way in C# to override a class method with an extension method?Làm thế nào để gọi phương thức mở rộng có cùng tên với một phương thức hiện có?

tôi có mã như

public class TestA 
{ 
    public string ColA { get; set; } 
    public string ColB { get; set; } 
    public string ColC { get; set; } 
    public void MethodA() 
    { 
     MessageBox.Show("Original A1."); 
    } 
} 

static class ExtenstionTest 
{ 

    public static void MethodA(this TestA A1) 
    { 
     MessageBox.Show("Extended A1."); 
    } 
} 

Bây giờ nếu tôi gọi MethodA như

TestA a = new TestA(); 
     a.MethodA(); 

Nó sẽ luôn gọi phương thức gốc. Làm thế nào tôi có thể gọi phương thức mở rộng.

+0

Cũng có một biến thể nhỏ http://stackoverflow.com/questions/2303885/if-an-extension-method-has-the-same-signature-as-a-method-in-the-sealed- class-w? rq = 1 –

Trả lời

26

Bạn không thể gọi phương thức tiện ích mở rộng làm phương thức tiện ích thông thường. Phương pháp dụ override phương thức mở rộng với cùng một chữ ký

EDIT:

Bạn có thể gọi nó như là một phương pháp tĩnh

ExtensionTest.MethodA(a); 
+2

sẽ không giải quyết được vấn đề của tôi. nhưng cảm ơn câu trả lời .. –

+1

Bạn được chào đón. Ý tưởng là nếu bạn muốn sử dụng phương pháp mở rộng làm phương pháp mở rộng chính hãng, bạn không thể sử dụng phương thức này nếu bạn có phương thức thể hiện có cùng chữ ký vì phương thức mẫu đó sẽ luôn có mức độ ưu tiên so với phương thức tiện ích mở rộng :) – Mihai

+1

+ 1 cho là câu trả lời chính xác đầu tiên, Ngạc nhiên khi thấy nó nhận được một downvote – Habib

2

Bạn có thể gọi phương thức mở rộng như bất kỳ phương pháp tĩnh khác:

ExtenstionTest.MethodA(a); 
6

Extension Methods - MSDN

Phương pháp mở rộng có cùng tên và chữ ký làm giao diện hoặc phương thức lớp sẽ không bao giờ được gọi là. Tại thời gian biên dịch, phương pháp mở rộng luôn có mức ưu tiên thấp hơn so với các phương thức mẫu được xác định trong chính loại đó.

Bạn có thể gọi phương thức mở rộng là phương thức tĩnh thông thường của một lớp.

ExtenstionTest.MethodA(a); 

Từ MSDN

Nói cách khác, nếu một loại có một Process phương thức có tên (int i), và bạn có một phương pháp khuyến nông với cùng một chữ ký, trình biên dịch sẽ luôn liên kết với phương thức cá thể. Khi trình biên dịch gặp một lời gọi phương thức , trước tiên nó sẽ tìm một kết quả phù hợp trong phương thức của kiểu. Nếu không tìm thấy kết quả phù hợp, nó sẽ tìm kiếm bất kỳ phần mở rộng nào các phương thức được xác định cho loại và liên kết với phương thức mở rộng đầu tiên mà nó tìm thấy. Ví dụ sau đây minh họa cách trình biên dịch xác định phương thức mở rộng hoặc phương thức mẫu nào để ràng buộc .

14

Bạn không thể gọi nó là làm phương thức mở rộng. Nó về cơ bản là vô dụng tại thời điểm này, về phương pháp mở rộng. (Cá nhân tôi muốn đây là một lời cảnh báo, nhưng đừng bận tâm.)

Trình biên dịch thử tất cả các phương thức thể hiện trước khi nó cố gắng giải quyết các phương pháp mở rộng. Từ phần 7.6.5.2 của thông số C# 4:

Trong một phương thức yêu cầu một trong các biểu mẫu [...] nếu xử lý thông thường, lệnh được thực hiện để xử lý xây dựng như một phương thức mở rộng.

và sau:

Các quy tắc trước có nghĩa là phương pháp dụ được ưu tiên hơn phương pháp khuyến nông

Bạn có thể gọi nó như một phương pháp tĩnh thường xuyên mặc dù:

// Fixed typo in name 
ExtensionTest.MethodA(a); 
0

khi những người khác đề xuất bạn không thể gọi phương thức này.Chỉ cách gọi duy nhất là:

TestA a = new TestA(); 
ExtenstionTest.MethodA(a); 
+6

Nếu những người khác đã đề xuất nó, điểm của việc đăng câu trả lời tương tự mà không mang gì mới? – Mihai

+3

+1 cho bạn.điều mới ở trên là "cách duy nhất" :) –

+3

Có. Nhưng mọi người khác đã nói rằng – Mihai

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