2010-11-19 72 views
5

Tôi tự hỏi nếu tôi có thể sử dụng phương pháp mở rộng hoặc các kỹ thuật khác để mở rộng lớp tĩnh như System.Net.Mime.MediaTypeNames.Image, nó có ít loại hơn tôi cần.phương pháp mở rộng để mở rộng lớp tĩnh

+0

Bạn không thể mở rộng các lớp tĩnh; tìm kiếm SO cho các bản sao của câu hỏi này và bạn sẽ thấy một số giải pháp. – BeemerGuy

+0

Tại sao bạn lại cần điều đó? Lớp tĩnh không có ngữ cảnh, và bất cứ điều gì bạn có thể bên trong một lớp tĩnh có thể được thực hiện "bất cứ nơi nào" khác trong mã. –

+0

@Amby - Tôi nghĩ bạn có thể muốn làm điều đó chỉ dành cho các tổ chức thanh lọc. Chắc chắn bạn có thể tạo một lớp ImageUtility tĩnh với các phương thức cần thiết (trong đó, theo câu trả lời này anh ta sẽ phải làm), nhưng tôi nghĩ OP sẽ tổ chức mã của anh ta theo cách mà anh ta không cần lớp bổ sung . Thật không may, bạn không thể. (Tôi đến đây tìm cách để làm tương tự). – MattW

Trả lời

6

Không, các phương pháp mở rộng chỉ có thể được sử dụng để thêm các phương thức thể hiện chứ không phải các phương thức tĩnh (hoặc thậm chí các thuộc tính). Các phương thức mở rộng thực sự chỉ là cú pháp đường xung quanh các phương thức tĩnh. Ví dụ, khi bạn sử dụng một phương pháp khuyến nông như Count():

var list = GetList(); 
var size = list.Count(); 

này là thực sự biên soạn để:

var list = GetList(); 
var size = Enumerable.Count(list); 

Bạn không thể thêm các phương pháp tĩnh bổ sung vào một lớp học hiện có sử dụng phương pháp khuyến nông .

+0

Có đúng không khi nói rằng "các phương thức mở rộng chỉ có thể được sử dụng để thêm các phương thức thể hiện"? Khi bạn giải thích, họ chỉ cho sự xuất hiện của các phương pháp thể hiện. Chúng không phải là các phương thức thực tế, hoặc bạn có thể truy cập các thành viên không phải là công khai của lớp. –

0

Không, điều này là chưa thể thực hiện được trong C#, mặc dù hy vọng nó sẽ trở thành như vậy tại một số điểm. Và bạn không thể phân lớp một lớp tĩnh và thêm các phương thức mới theo cách đó, vì các lớp tĩnh phải lấy được từ object. Tuy nhiên, một điều bạn có thể làm là tạo ra một hiệu ứng khá giống trong mã của bạn, đơn giản là khai báo một lớp tĩnh khác mà bạn sẽ sử dụng thay vào đó khi bạn muốn các phương thức mở rộng của mình. Ví dụ:

public static class MessageBox2 
{ 
    public static DialogResult ShowError(string Caption, string Message, params object[] OptionalFormatArgs) 
    { 
     return MessageBox.Show(string.Format(Message, OptionalFormatArgs), Caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

Kể từ khi lớp học ban đầu là tĩnh, theo định nghĩa phương pháp "mở rộng" không cần phải nhận được một thể hiện như một tham số this, và chỉ đơn giản là có thể sử dụng phương thức tĩnh của lớp gốc.

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