Có thể ghi đè phương thức riêng tư bằng cách sử dụng Phản chiếu trong .NET 3.5 không?Ghi đè phương pháp riêng với Reflection
Trả lời
Vâng, nó sẽ cần phải là virtual
để có thể ghi đè lên nó (bằng cách viết một loại động kế thừa từ lớp), và bạn không thể có một private virtual
(nó không có ý nghĩa). Bạn có lẽ có thể ghi đè lên một số internal virtual
, nhưng tôi nghi ngờ thậm chí điều này có thể gây ra các vấn đề bảo mật. Vì vậy, cuối cùng, tôi muốn nói không.
Không phải bằng cách sử dụng Phản chiếu. Bạn cần sử dụng một số loại AOP.
Không chỉ bằng cách sử dụng Phản chiếu. Có lẽ điều tốt nhất bạn có thể làm là sử dụng Reflection, kết hợp với Reflection.Emit hoặc CodeDom để nhân bản lớp đó thành một không gian tên mới. Khi bạn đi qua phương pháp riêng tư mà bạn muốn thay thế, bạn không sao chép nó, bạn phát ra sự thay thế của mình.
Tuy nhiên, có rất nhiều kỹ thuật mà nhà phát triển có thể sử dụng khiến kỹ thuật này khó khăn hơn nhiều. Phá vỡ việc thực hiện của lớp vào nhiều lớp học tư nhân hoặc nội bộ là một trong những như vậy.
Lưu ý: sử dụng CodeDom bạn phải tạo biểu đồ trong bộ nhớ, biên dịch nó và sau đó tải cụm kết quả.
Đây có thể là một vấn đề lớn hơn rất nhiều so với giá trị.
Cách khác để thực hiện việc này là sử dụng Reflector để tháo rời lớp học, lấy mã và tạo lớp của riêng bạn từ lớp đó bằng phương pháp thay thế. Một lần nữa có những rào cản kỹ thuật và pháp lý đáng kể để vượt qua. Bạn có thể học được rất nhiều từ mã đã được tháo rời.
Typemock Isolator được cho là có khả năng thực hiện điều này, nhưng thực hiện thông qua API lược tả .NET (theo Roy Osherove trong The Art of Unit Testing).
- 1. Khó hiểu "ghi đè lên một phương pháp riêng"
- 2. Ghi đè phương thức bằng so với phương pháp mới
- 3. Tìm phương pháp ghi đè
- 4. Phương pháp trừu tượng ghi đè phương pháp trừu tượng
- 5. Các phương pháp ghi đè trong JavaDoc
- 6. Ghi đè bằng phương pháp trong DTO's
- 7. Ghi đè backbone 'set' phương pháp
- 8. Ghi đè phương pháp được bảo vệ
- 9. ghi đè phương pháp ảo C++
- 10. Ghi đè phương thức ghi đè (C#)
- 11. Ghi đè (hoặc đổ bóng) một phương pháp với phương pháp mở rộng?
- 12. Phương pháp riêng trong siêu lớp có bị ghi đè trong phân lớp không?
- 13. Ghi đè phương thức với đối tượng
- 14. Ghi đè so với phương thức ẩn
- 15. Phương pháp phải được ghi đè nhưng không trừu tượng?
- 16. Java: Cách ghi đè phương pháp chung này?
- 17. Sử dụng Groovy metaclass ghi đè lên phương pháp
- 18. Làm rõ phương pháp ghi đè lên trộn bằng Ruby
- 19. Lựa chọn phương pháp có quá tải và ghi đè
- 20. Ghi đè đăng ký ghi đè Tạo Phương thức
- 21. Mục tiêu-C - Phương pháp ghi đè trong phân lớp
- 22. Phương pháp ghi đè bên trong tiện ích jquery
- 23. Phương pháp ghi đè để thay đổi kiểu trả về
- 24. Gọi một phương pháp ghi đè từ một constructor
- 25. Gọi một phương pháp ghi đè từ lớp cơ sở
- 26. Ghi đè đối tượng ghi đè với các liên kết
- 27. Java: Gọi một phương pháp siêu trong đó kêu gọi một phương pháp ghi đè
- 28. Tôi có thể sử dụng phương pháp ghi đè phương pháp phi ảo không?
- 29. Gọi phương thức ghi đè, siêu lớp cuộc gọi đã ghi đè phương thức
- 30. Ghi đè truy vấn phương tiện CSS
... hoặc bạn không thể học được gì, nếu mã bị làm mờ. –
của bạn có thể tìm hiểu rằng một số mã được obfuscated :-) –