2010-05-08 19 views
5

Tôi có một số lớp được trang trí với DebuggerDisplayAttribute.Có tồn tại phương thức để hiển thị đối tượng bằng DebuggerDisplayAttribute

Tôi muốn có thể thêm câu lệnh theo dõi vào Bài kiểm tra đơn vị sẽ hiển thị các trường hợp của các lớp này.

Hiện có tồn tại một phương pháp trong Khuôn khổ .NET sẽ hiển thị đối tượng được định dạng bằng DebuggerDisplayAttribute (hoặc quay trở lại sử dụng .ToString() nếu không có DebuggerDisplayAttribute được định nghĩa) không?

EDIT

Để làm rõ, tôi đã hy vọng có thể có một cái gì đó được xây dựng vào khung. Tôi biết tôi có thể có được giá trị tài sản từ DebuggerDisplayAttribute, nhưng sau đó tôi cần phải định dạng ví dụ của tôi bằng cách sử dụng chuỗi định dạng đại diện bởi DebuggerDisplayAttribute.Value.

Nếu tôi cuộn của riêng tôi, tôi muốn dự tính một phương pháp mở rộng dọc theo dòng sau đây:

public string FormatDebugDisplay(this object value) 
{ 
    DebugDisplayAttribute attribute = ... get the attribute for value ... 
    if (attribute = null) return value.ToString(); 

    string formatString = attribute.Value; 

    ??? How do I format value using formatString ??? 
    return SomeFormatMethod(formatString, value); 
} 

Trả lời

2

Điều đó có thể tốt đẹp - nhưng chuỗi định dạng của DebuggerDisplayAttribute được đánh giá bởi trình gỡ lỗi, giống như cách nó đánh giá các biểu thức bạn nhập vào cửa sổ Xem o r cửa sổ ngay lập tức. Đó là lý do tại sao bạn có thể đặt các biểu thức tùy ý bên trong niềng răng, như {FirstName + " " + LastName}.

Do đó, để đánh giá các mã này trong mã của bạn, bạn cần phải nhúng trình gỡ lỗi Visual Studio vào ứng dụng của mình. Có lẽ sẽ không xảy ra. (cười)

Đặt cược tốt nhất của bạn có lẽ là lấy tất cả logic định dạng hiện đang có trong chuỗi định dạng DebuggerDisplay của bạn và thay vào đó, hãy tạo một phương thức. Sau đó, bạn được tự do gọi phương thức đó từ mã của bạn. Thuộc tính DebuggerDisplay của bạn kết thúc không làm gì ngoài việc gọi phương thức.

[DebuggerDisplay("{Inspect()}")] 
public class MyClass { 
    public string Inspect() { ... } 
} 
+0

Cảm ơn. Viết phương pháp của riêng tôi theo cách bạn mô tả loại thất bại mục đích của những gì tôi đã cố gắng đạt được. Tôi đã đi với trọng ToString() cho các lớp học trong câu hỏi. – Joe

+0

Nếu mã ứng dụng của bạn không gán bất kỳ ý nghĩa nào cho ToString(), thì có, điều đó đơn giản hơn. Trong một số trường hợp, ToString() đã có ý nghĩa (ví dụ:để hiển thị đối tượng trong hộp danh sách), và trong những trường hợp đó, DebuggerDisplay cộng với một phương thức vẫn có thể hữu ích. –

+0

Bạn sẽ không cần phải "nhúng trình gỡ lỗi Visual Studio vào ứng dụng của bạn" để viết một phương thức cung cấp giá trị. Tôi nghi ngờ rằng _most_ sử dụng DebuggerDisplay là các giá trị thuộc tính đơn giản và việc triển khai thực hiện đó sẽ là một phương thức có giá trị. –

1

Các DebuggerDisplayAttribute có một tài sản Value trả về những gì bạn muốn.

Vì vậy, bạn có thể có thể sử dụng một cái gì đó như thế này:

var attribute = obj.GetType(). 
    GetCustomAttributes(typeof(DebuggerDisplayAttribute), false); 
return (attribute == null) ? obj.ToString() : attribute.Value; 

Bạn thậm chí có thể đưa điều này vào một phương pháp khuyến nông:

public static string ToDebugString(this object obj) 
{ 
    var attribute = obj.GetType(). 
     GetCustomAttributes(typeof(DebuggerDisplayAttribute), false); 
    return (attribute == null) ? obj.ToString() : attribute.Value; 
} 

các bạn có thể gọi nó trên tất cả các đối tượng: myObject.ToDebugString()

+1

Vâng, tôi biết tôi có thể tự cuộn, câu hỏi là liệu có bất kỳ điều gì đã tồn tại hay không. Mẫu của bạn không giúp được gì - nó sẽ chỉ hiển thị chuỗi định dạng của thuộc tính thay vì định dạng obj bằng chuỗi định dạng. – Joe

0

Phương pháp này sẽ không thực hiện chính xác những gì DebuggerDisplayAttribute cung cấp trong trình gỡ lỗi, nhưng đây là những gì tôi đã được sử dụng trong mã của tôi. Nó bao gồm khoảng 90% (hoặc nhiều hơn) các trường hợp chúng tôi gặp trong codebase của chúng tôi. Nếu bạn sửa chữa nó để trang trải nhiều trường hợp hơn, tôi rất muốn thấy các cải tiến của bạn!

public static string ToDebuggerString(this object @this) 
    { 
     var display = @this.GetType().GetCustomAttributes(typeof (DebuggerDisplayAttribute),false).FirstOrDefault() as DebuggerDisplayAttribute; 
     if (display == null) 
      return @this.ToString(); 

     var format = display.Value; 
     var builder = new StringBuilder(); 
     for (var index = 0; index < format.Length; index++) 
     { 
      if (format[index] == '{') 
      { 
       var close = format.IndexOf('}', index); 
       if (close > index) 
       { 
        index++; 
        var name = format.Substring(index, close - index); 
        var property = @this.GetType().GetProperty(name); 
        if (property != null) 
        { 
         var value = property.GetValue(@this, null).ToString(); 
         builder.Append(value); 
         index += name.Length; 
        } 
       } 
      } 
      else 
       builder.Append(format[index]); 
     } 
     return builder.ToString(); 
    } 
Các vấn đề liên quan