2008-11-03 32 views
12

Tôi có một vấn đề áp dụng các thuộc tính DebuggerDisplay trên một lớp chung:DebuggerDisplay trên generic class

[DebuggerDisplay("--foo--")] 
class Foo 
{ 
} 

[DebuggerDisplay("Bar: {t}")] 
class Bar<T> 
{ 
    public T t; 
} 

Khi kiểm tra một đối tượng kiểu Bar<Foo> Tôi mong chờ nó hiển thị như Bar: --foo--, nhưng tôi nhận Bar: {Foo}

Tôi đang làm gì sai?

Trả lời

19

Thuộc tính DebuggerDisplay không đệ quy. {} Bên trong chuỗi cơ bản nói đánh giá biểu thức này và hiển thị nội tuyến kết quả. Chuỗi cho kết quả bên trong được tính như thể không có thuộc tính DebuggerDisplay trong trò chơi cho loại hoặc thành viên. Đó là lý do tại sao bạn thấy {Foo} thay vì --foo--.

Lý do cho điều này là độ tin cậy. Quá dễ dàng để có thẻ thuộc tính DebuggerDisplay cùng đệ quy. Điều này sẽ gây ra tràn ngăn xếp hoặc vòng lặp vô hạn xảy ra khi đánh giá biểu thức bên trong. Không đệ quy đánh giá thuộc tính DebuggerDisplay ngăn cản đệ quy vô hạn này (mặc dù người dùng vẫn có thể tự tạo nó bên trong một biểu thức cụ thể).

Một cách bạn có thể kiểm soát cách biểu thức bên trong được hiển thị bằng cách ghi đè phương thức .ToString(). Điều này sẽ được đánh giá khi tính toán chuỗi hiển thị cho một biểu thức bên trong.

+0

Cảm ơn! Vì vậy, nó không có gì để làm với chung chung, tôi đoán. Tôi sẽ đi cho giải pháp ToString. –

0

Bạn có thể sử dụng [DebuggerDisplay("Bar<{typeof(T).Name}>,nq}")]//nq - no quotes.

Bạn cũng có thể sử dụng các thông lệ: DebuggerDisplay attribute best practices

+0

Tôi tin rằng nó nên đọc: '[DebuggerDisplay (" Bar <{typeof (T) .Name, nq}> ")]' – DavWEB

2

[Disclaimer: Tôi đang liên kết với OzCode]

Bạn có thể sử dụng tính năng hỗ trợ lồng/recursive thông tin debug OzCode của Reveal. enter image description here
Khi bạn xác định nó cho một trường hợp, nó sẽ được sử dụng tự động cho tất cả các trường hợp thuộc loại đó.