2010-10-26 38 views
6

Tôi cần tạo một hàm nhận tất cả các tính thích hợp của một đối tượng (bao gồm cả đối tượng con). Ngay bây giờ mã của tôi luôn trả về 0 thuộc tính. Vui lòng cho tôi biết tôi đang làm gì sai, cảm ơn!Lớp phản chiếu để lấy tất cả các thuộc tính của bất kỳ đối tượng nào

public static string GetAllProperiesOfObject(object thisObject) 
{ 
    string result = string.Empty; 
    try 
    { 
     // get all public static properties of MyClass type 
     PropertyInfo[] propertyInfos; 
     propertyInfos = thisObject.GetType().GetProperties(BindingFlags.Public | BindingFlags.Static);//By default, it will return only public properties. 
     // sort properties by name 
     Array.Sort(propertyInfos, 
        (propertyInfo1, propertyInfo2) => propertyInfo1.Name.CompareTo(propertyInfo2.Name)); 

     // write property names 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<hr />"); 
     foreach (PropertyInfo propertyInfo in propertyInfos) 
     { 
      sb.AppendFormat("Name: {0} | Value: {1} <br>", propertyInfo.Name, "Get Value"); 
     } 
     sb.Append("<hr />"); 
     result = sb.ToString(); 
    } 
    catch (Exception exception) 
    { 
     // to do log it 
    } 

    return result; 
} 

đây là những gì các đối tượng trông giống như: alt text alt text

+0

(IPAddress, MerchantSessionId, vv) là thuộc tính chứ không phải là trường, phải không? –

+0

Reed, tôi không chắc chắn. Tuy nhiên tôi quan tâm đến việc nhận được tất cả các lĩnh vực và tài sản. Bao gồm bất kỳ đối tượng phụ nào. – aron

Trả lời

6

Nếu bạn muốn tất cả các thuộc tính, hãy thử:

propertyInfos = thisObject.GetType().GetProperties(
     BindingFlags.Public | BindingFlags.NonPublic // Get public and non-public 
    | BindingFlags.Static | BindingFlags.Instance // Get instance + static 
    | BindingFlags.FlattenHierarchy); // Search up the hierarchy 

Để biết chi tiết, xem BindingFlags.

+0

Hi Reed, cảm ơn. Tôi đã thêm điều này nhưng tôi vẫn nhận được 0 thuộc tính. Tôi đã thêm hình ảnh vào câu hỏi của mình, xem ở trên. cảm ơn! – aron

0

propertyInfos mảng của bạn trả về 0 độ dài cho một trong các lớp học của tôi. Thay đổi dòng là

propertyInfos = thisObject.GetType().GetProperties(); 

Kết quả trong đó đang được điền. Do đó, dòng mã này là vấn đề của bạn. Nó xuất hiện nếu bạn thêm cờ

BindingFlags.Instance 

vào tham số của bạn nó sẽ trả lại các thuộc tính giống như cuộc gọi không tham số. Việc thêm thông số này vào danh sách của bạn có khắc phục được sự cố không?

CHỈNH SỬA: Vừa xem bản chỉnh sửa của bạn. Dựa trên mã bạn đăng, nó cũng không làm việc cho tôi. Thêm BindingFlags.Instance làm cho nó trả về các thuộc tính cho tôi. Tôi khuyên bạn nên đăng mã chính xác mà bạn đang gặp sự cố khi ảnh chụp màn hình của bạn hiển thị mã khác.

+0

Xin chào, mã ở trên là mã hiện tại của tôi. Trong ảnh chụp màn hình, tôi đã thử đề xuất của Reed Copsey. – aron

+0

bạn có thể thử mã trên một đối tượng đơn giản hơn để xem nó có hoạt động không? Nếu không, bạn có thể đăng mã của lớp bạn đang thử không? – mike

2

Sự cố với mã của bạn là các loại phản hồi PayPal là thành viên, KHÔNG phải là thuộc tính. Hãy thử:

MemberInfo[] memberInfos = 
    thisObject.GetMembers(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); 
+2

Một lưu ý ở đây: một thành viên là bất cứ điều gì, có thể là biến, phương pháp, sự kiện hoặc tài sản được định nghĩa không tĩnh trong một lớp học. Biến thành viên được gọi là 'trường'. Vì vậy, hoặc là các trường truy vấn và thuộc tính riêng biệt hoặc, cách khác, truy vấn tất cả các thành viên và lọc nó thành những người có 'MemberType' của' MemberTypes.Field' hoặc 'MemberType.Property'. –

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