Có cách nào để lấy giá trị của trường tĩnh riêng từ lớp đã biết bằng cách sử dụng sự phản chiếu không?Làm thế nào để có được giá trị của một trường tĩnh riêng từ một lớp?
Trả lời
Có.
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
Đây là trường. Đối với thuộc tính, hãy thay đổi type.GetField
thành type.GetProperty
. Bạn cũng có thể truy cập các phương thức riêng tư theo cách tương tự.
Hãy thử một cái gì đó như thế này:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
tôi sẽ nghĩ đó là nên làm việc.
MemberInfo không có phương thức 'GetValue (...)' hoặc 'SetValue (...)'. Thành viên thường là phương pháp/chức năng thực tế hơn. – IAbstract
Như đã nêu ở trên, bạn có thể sử dụng System.Type::GetMembers()
với BindingFlags
::NonPublic | BindingFlags::Static
, nhưng chỉ khi bạn có quyền ReflectionPermission
.
Nếu bạn có niềm tin đầy đủ, bạn sẽ có thể làm:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
Tuy nhiên, nếu bạn chạy trên một hệ thống mà không tin tưởng đầy đủ, cuộc gọi GetField sẽ thất bại, và điều này sẽ không làm việc.
Tôi cho rằng ai đó nên hỏi xem đây có phải là một ý tưởng hay không? Nó tạo ra một sự phụ thuộc vào việc thực hiện riêng tư của lớp tĩnh này. Việc triển khai riêng tư có thể thay đổi mà không có bất kỳ thông báo nào được cung cấp cho những người sử dụng Phản ánh để truy cập vào việc triển khai riêng tư.
Nếu hai lớp có nghĩa là làm việc cùng nhau, hãy cân nhắc tạo trường nội bộ và thêm nhóm lắp ráp của lớp hợp tác trong thuộc tính [assembly: InternalsVisibleTo].
Trong mã sản xuất, đây thường là một ý tưởng tồi. Tuy nhiên nó có thể rất hữu ích khi thử nghiệm đơn vị, bởi vì bạn có thể viết các bài kiểm tra mà không cần phải để lộ các trường mà bạn muốn giữ riêng tư. – AVee
@AVee: để kiểm tra đơn vị, tạo trường 'internal' và sử dụng' InternalsVisibleTo'. Tốt hơn, kiểm tra đơn vị không nên kiểm tra việc triển khai, chỉ có hành vi đúng. Bằng cách tùy thuộc vào trường riêng tư, bây giờ kiểm tra đơn vị sẽ phá vỡ nếu việc thực hiện lớp thay đổi. –
Tôi đồng ý với @JohnSaunders phản ánh như thế này là rất giòn. Có những trường hợp mặc dù nó nên tồn tại như một công việc tạm thời xung quanh - tức là mã sản xuất đã được phát hành, nhưng tôi cần một tiện ích đặc biệt để chạy một số thử nghiệm chấp nhận. Tôi chỉ có thể đạt được điều này bằng cách truy cập một trường tĩnh riêng thông qua sự phản chiếu. Mã này sẽ thay đổi và lớp được phản ánh sẽ được sửa đổi để cho phép tương tác được yêu cầu bởi tiện ích mới trong bản phát hành tiếp theo. – IAbstract
- 1. Đặt giá trị của trường tĩnh riêng
- 2. Làm thế nào để làm cho giá trị tiêm xuân vào một trường tĩnh
- 3. Làm thế nào để có được tương đương với một trường tĩnh (lớp) trong Delphi?
- 4. Mùa xuân: Làm thế nào để tiêm một giá trị vào trường tĩnh?
- 5. Làm thế nào để có được logger của một lớp trong một bối cảnh tĩnh?
- 6. Làm thế nào để có được giá trị của một hạn chế miền trong Grails?
- 7. Làm thế nào một lớp tĩnh có thể lấy được từ một đối tượng?
- 8. Làm thế nào để có được (sub) tên lớp từ một phương pháp tĩnh trong Python?
- 9. Làm thế nào để có được một giá trị từ một bộ tạo trong Python?
- 10. Scala 2,10 phản ánh, làm thế nào để trích xuất các giá trị trường từ một trường hợp lớp
- 11. MongoDB: Làm thế nào để có được danh sách riêng biệt của các giá trị trường tài liệu phụ?
- 12. Làm thế nào tôi có thể nhận được giá trị của một biến phiên trong một phương thức tĩnh?
- 13. Làm thế nào để có được các lĩnh vực và các giá trị của họ từ một lớp tĩnh trong hội đồng tham chiếu
- 14. C#: Làm thế nào để gọi một phương thức tĩnh của một lớp cơ sở từ một phương thức tĩnh của một lớp dẫn xuất?
- 15. Làm thế nào để có được lớp của một trường kiểu T?
- 16. làm thế nào để xóa một khóa từ một từ điển có giá trị cao nhất?
- 17. Làm thế nào tôi có thể sử dụng Reflection để có được giá trị của một tài sản tĩnh của một loại mà không có một trường hợp cụ thể
- 18. Làm cách nào để triển khai trường tĩnh hoặc trường tĩnh của chính tôi
- 19. Làm thế nào để có được "giá trị" của một FilteringSelect <select> trong dojo?
- 20. làm thế nào để thêm vào giá trị của một trường nhập với Jquery
- 21. Làm thế nào để có được một giá trị enum từ chuỗi trong C#?
- 22. Làm thế nào để có được cùng một giá trị từ hai mảng trong PHP?
- 23. Sử dụng phản ánh để có được giá trị của thuộc tính có tên trong một trường hợp lớp
- 24. làm thế nào để có được giá trị của một textarea trong jquery?
- 25. Lấy các giá trị trường tĩnh của một kiểu bằng cách sử dụng sự phản chiếu
- 26. Làm thế nào để có được giá trị của một biến được đặt tên của nó trong một chuỗi?
- 27. Làm thế nào để nhận được giá trị của một bit tại một vị trí nhất định từ một byte?
- 28. Giả lập một trường tĩnh riêng với JMockit?
- 29. Làm thế nào để có được giá trị của một div bằng javascript
- 30. Làm thế nào để có được giá trị của một UISwitch?
Có thể đáng lưu ý rằng trường tĩnh cũng có thể được gán thông qua 'info.SetValue (null, value)'. Tôi đã sử dụng câu trả lời này để đặt giá trị thành trường tĩnh. – IAbstract