2011-09-27 36 views
24
public class TestClass 
{ 
     public string property1 { get; set; } 
     public string property2 { get; set; } 

     internal string property3 { get; set; } 
     internal string property4 { get; set; } 
     internal string property5 { get; set; } 
} 

Tôi có thể lặp qua các thuộc tính bằng vòng lặp sau, nhưng nó chỉ hiển thị các thuộc tính công khai. Tôi cần tất cả các tài sản.Tôi làm cách nào để lặp qua các thuộc tính nội bộ trong C#

foreach (PropertyInfo property in typeof(TestClass).GetProperties()) 
{ 
    //do something 
} 
+0

Xem thêm http://stackoverflow.com/questions/16024006/how-do-i-look-up-the-internal-properties -of-ac-sharp-class-protected-protecte cho một biến thể cho việc này. – nawfal

Trả lời

48

Bạn cần phải xác định rằng bạn không chỉ cần tài sản công cộng, sử dụng overload chấp nhận BindingFlags:

foreach (PropertyInfo property in typeof(TestClass) 
      .GetProperties(BindingFlags.Instance | 
          BindingFlags.NonPublic | 
          BindingFlags.Public)) 
{ 
    //do something 
} 

Thêm BindingFlags.Static nếu bạn muốn bao gồm các thuộc tính tĩnh.

Quá tải không tham số chỉ trả về các thuộc tính công khai.

+7

Cho phép NonPublic và Instance sẽ ẩn prop 1 và prop 2, bạn cần cả hai, NonPublic | Công khai cho tất cả các thuộc tính –

+0

dù sao để chọn chỉ được bảo vệ hoặc nội bộ? –

+0

@NevilleNazerane: Không có cờ ràng buộc, mà tôi biết. Chỉ cần lọc sau đó. –

10

Bạn cần phải thay đổi BindingFlags theo yêu cầu của bạn để Type.GetProperties

Hãy thử:

var instanceProperties = typeof(TestClass).GetProperties(
    BindingFlags.Public | 
    BindingFlags.NonPublic | 
    BindingFlags.Instance 
); 
foreach(var instanceProperty in instanceProperties) { 
    // a little something something for the instanceProperty 
} 
+0

vâng, tôi phải thêm BindingFlags.Public cũng như – gangt

3

Sử dụng BindingFlags

foreach (PropertyInfo property in typeof(TestClass) 
     .GetProperties(
      BindingFlags.Public | 
      BindingFlags.NonPublic | 
      BindingFlags.Instance)) 
{ 
    //do something 
} 
3

bằng cách xác định những gì bindingflags trong GetProperties:

foreach (PropertyInfo property in typeof(TestClass).GetProperties(
     BindingFlags.Instance| 
     BindingFlags.Public| 
     BindingFlags.NonPublic)) 
3

Theo MSDN, tư nhân và nội bộ không được công nhận trong Reflection API.

Để xác định phương thức nội bộ bằng Reflection, hãy sử dụng thuộc tính IsAssembly . Để xác định phương thức nội bộ được bảo vệ, hãy sử dụng IsFamilyOrAssembly.

Nếu bạn đang viết một số đơn vị kiểm tra Bạn có thể muốn xem qua thuộc tính InternalsVisibleTo. Nó cho phép bạn chỉ định assembly nào có thể xem các thuộc tính bên trong.

Và cuối cùng, đừng Bạn thực sự cần phải có các tính chất nội bộ ...

+0

vâng tôi làm, đó là lớp dịch vụ wcf, tôi muốn khách hàng điền vào một số thuộc tính trước khi gửi nó đến máy chủ, và phần còn lại của các thuộc tính được điền vào dịch vụ. – gangt

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