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
Trả lời
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 .
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. –
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.
- 1. Phương pháp mở rộng trên lớp tĩnh?
- 2. PHP - mở rộng phương pháp như mở rộng một lớp
- 3. Phương pháp mở rộng ảo?
- 4. Phương pháp mở rộng tĩnh trên mô-đun Seq
- 5. Mở rộng các lớp tĩnh PHP
- 6. Tổ chức các phương pháp mở rộng
- 7. Mocking Phương pháp mở rộng với Moq
- 8. Mở rộng nhiều lớp
- 9. Phương pháp mở rộng so với Helper Lớp
- 10. LINQ và phương pháp mở rộng Đếm
- 11. Phương pháp mở rộng chuỗi trong C#
- 12. Độ phân giải phương pháp mở rộng
- 13. javascript prototype mở rộng phương pháp
- 14. Cách tạo phương pháp mở rộng chung?
- 15. Phương pháp mở rộng bằng Python
- 16. Phương pháp mở rộng cho nullable enum
- 17. Phương pháp mở rộng cho Enumerable.Intersperse?
- 18. Phương pháp mở rộng liệt kê
- 19. Phương pháp mở rộng TryParse chung
- 20. Phương pháp mở rộng không được phép trong các lớp tĩnh lồng nhau?
- 21. phương pháp mở rộng phải được xác định trong không chung lớp tĩnh
- 22. Lớp động mở rộng
- 23. Javascript mở rộng lớp
- 24. Mở rộng Groovy lớp String
- 25. Có thể có phương pháp mở rộng riêng tư không?
- 26. Thuộc tính mở rộng VB thay vì phương pháp mở rộng
- 27. C#: điều hành ngầm và mở rộng các phương pháp
- 28. ArgumentNullException hoặc NullReferenceException từ phương pháp mở rộng?
- 29. lớp bên trong mở rộng
- 30. Cách mở rộng lớp css
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
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ã. –
@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