2009-03-10 42 views

Trả lời

60

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ự.

+1

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

-1

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.

+0

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

1

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.

5

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].

+1

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

+3

@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. –

+1

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

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