2010-10-26 25 views
30

Hãy tưởng tượng một lớp học có nhiều thuộc tính công khai. Đối với một số lý do, không thể cấu trúc lại lớp này thành các lớp con nhỏ hơn.Làm cách nào để tự động hiển thị tất cả các thuộc tính của một lớp và các giá trị của chúng trong một chuỗi?

Tôi muốn thêm một ghi đè ToString trả về một cái gì đó dọc theo dòng:

 
Property 1: Value of property 1\n 
Property 2: Value of property 2\n 
... 

Có cách nào để làm điều này?

+0

Tôi đã bỏ phiếu để đóng như dupe, nhưng một hợp nhất sẽ có vẻ thích hợp, quá. – mafu

Trả lời

59

Tôi nghĩ bạn có thể sử dụng một chút phản ánh tại đây. Hãy xem Type.GetProperties().

private PropertyInfo[] _PropertyInfos = null; 

public override string ToString() 
{ 
    if(_PropertyInfos == null) 
     _PropertyInfos = this.GetType().GetProperties(); 

    var sb = new StringBuilder(); 

    foreach (var info in _PropertyInfos) 
    { 
     var value = info.GetValue(this, null) ?? "(null)"; 
     sb.AppendLine(info.Name + ": " + value.ToString()); 
    } 

    return sb.ToString(); 
} 
+3

+1 Câu trả lời hay. Có một lỗi nhỏ. _PropertyInfos luôn luôn là null nó phải là '_PropertyInfos = this.GetType(). GetProperties();' trong if. –

+0

@ conrad-frix: Vâng, bạn nói đúng. Cố định nó, nhưng do đánh dấu là câu trả lời chính xác và upvotes tôi nghĩ rằng tất cả mọi người cố định nó đã có trên mình. – Oliver

+0

Cảm ơn câu trả lời này. btw nó ném ngoại lệ về giá trị tài sản null. –

3

Bạn có thể thực hiện việc này thông qua phản ánh.

PropertyInfo[] properties = MyClass.GetType().GetProperties(); 
foreach(PropertyInfo prop in properties) 
{ 
... 
} 
+0

MyClass.GetType() sẽ không hoạt động. Bạn nên gọi GetType() trên instance của MyClass. –

+0

Hoặc sử dụng typeof (MyClass) – VikciaR

1

Nếu bạn có quyền truy cập vào mã của lớp bạn cần thì bạn chỉ có thể ghi đè phương thức ToString(). Nếu không, bạn có thể sử dụng Reflections để đọc thông tin từ đối tượng Loại:

typeof(YourClass).GetProperties() 
16

@ câu trả lời của Oliver là một phương pháp mở rộng (mà tôi nghĩ phù hợp với nó cũng)

public static string PropertyList(this object obj) 
{ 
    var props = obj.GetType().GetProperties(); 
    var sb = new StringBuilder(); 
    foreach (var p in props) 
    { 
    sb.AppendLine(p.Name + ": " + p.GetValue(obj, null)); 
    } 
    return sb.ToString(); 
} 
1

Bạn có thể lấy cảm hứng từ một mẫn phức tạp hơn của nhà nước từ gói StatePrinter class introspector

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