2011-05-06 27 views
11

Tôi có lớp B và lớp cha mẹ A, cả hai đều trong Miền không gian tên.Làm thế nào để có được các trường riêng của lớp và lớp cha mẹ của nó bằng cách phản ánh?

  • Loại A, có trường riêng a;
  • Lớp B, có trường riêng b;

Sau đó, tôi có Reflection Util trong không gian tên Reflect. Nếu tôi sử dụng dòng này

instanceOfB.GetType().GetFields(BindingFlags.NonPublic 
     | BindingFlags.Public | BindingFlags.Instance); 

để tìm tất cả các lĩnh vực (một & b), tôi nhận được chỉ b. Nhưng khi tôi thực hiện a được bảo vệ hoặc công khai, tôi cũng tìm thấy chúng.

Tôi cần phải làm gì để tìm các trường riêng tư của lớp cơ sở?

Trả lời

13

Đây là documented behaviour:

Chỉ định BindingFlags.NonPublic để bao gồm các lĩnh vực ngoài công lập (có nghĩa là, tư nhân, nội bộ, và các lĩnh vực bảo vệ) trong việc tìm kiếm. Chỉ các trường được bảo vệ và nội bộ trên các lớp cơ sở mới được trả về; các trường riêng trên các lớp cơ sở không được trả về.

Nếu bạn cần nhận các trường riêng tư, bạn cần phải hỏi loại cơ sở. (Sử dụng Type.BaseType để tìm các loại cơ sở, và gọi GetFields về điều đó.)

+0

Hãy cho phép tôi để hỏi thêm một chút: Khi tôi đi đệ quy throug hệ thống phân cấp lớp, làm thế nào để đảm bảo rằng Tôi có được mọi lĩnh vực (ngay cả các lĩnh vực công cộng của phụ huynh) chỉ một lần? – Ralph

+1

@Ralph: Bạn có thể sử dụng 'BindingFlags.DeclaredOnly' để * tránh * nhận các trường được kế thừa từ các lớp cơ sở. –

+0

Jon Skeet: Cảm ơn rất nhiều – Ralph

1
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
-4
public class A 
{ 
    private int aa; 
} 

public class B 
{ 
    private int bb; 
} 

System.Reflection.FieldInfo[] fields = (new B()).GetType().GetFields(BindingFlags.NonPublic| BindingFlags.Public | BindingFlags.Instance); 
+0

Anh ấy đã bao gồm những giá trị đó, theo câu hỏi. –

+0

Sir Nó hoạt động tốt ở cuối của tôi, Bằng cách làm theo các dòng trên của mã. Nó cho thấy biến riêng. – Pankaj

+0

Các biến riêng của lớp * base *? Nó không nên. –

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