22/08/2018, 11:46

Mẹo nhỏ về .NET: Hiển thị tất cả các trường và thuộc tính của một đối tượng

Jay Miller Visua Studio cung cấp một công cụ giúp những nhà phát triển có thể quan sát các hoạt động, nó cung cấp rất nhiều thông tin hữu ích đặc biệt trong quá trình xử lý lỗi (debug). Tuy vậy đôi khi việc quan sát các đối tượng trong suốt phiên xử lý ...

Jay Miller

Visua Studio cung cấp một công cụ giúp những nhà phát triển có thể quan sát các hoạt động, nó cung cấp rất nhiều thông tin hữu ích đặc biệt trong quá trình xử lý lỗi (debug). Tuy vậy đôi khi việc quan sát các đối tượng trong suốt phiên xử lý lỗi tương tác không phải là đã đủ. Khi làm việc với các ứng dụng đa hoạt động xảy ra trong cùng một thời điểm như dữ liệu đang vào hay các sự kiện phát sinh, những hoạt động không thể điều khiển trong cùng một thời gian. Đôi khi, hoạt động gỡ lỗi (debug) của chính nó còn khiến vấn đề càng đi xa hơn và có khi còn bị che dấu trong suốt thời gian phiên gỡ lỗi tương tác.

Trong trường hợp này, bạn cần phải kết xuất trạng thái của một số đối tượng trước và sau khi sự kiện diễn ra để xác định xem những gì đang xảy ra. Cách đơn giản nhất để thực hiện vấn đề này là sử dụng sự phản xạ để có một đối tượng có trạng thái kết xuất của chính nó. Chính vì vậy đã tạo một phương pháp tĩnh trong một lớp tiện ích, sử dụng một đối tượng và trả về một chuỗi gồm có kiểu của đối tượng cũng như các giá trị của tất cả các trường và thuộc tính của đối tượng này. Đây là toàn bộ phương pháp các bạn có thể tham khảo:

public static string DisplayObjectInfo(Object o)
{
StringBuilder sb = new StringBuilder();
// Include the type of the object
System.Type type = o.GetType();
sb.Append("Type: " + type.Name);
// Include information for each Field
sb.Append("

Fields:");
System.Reflection.FieldInfo[] fi = type.GetFields();
if (fi.Length > 0)
{
foreach (FieldInfo f in fi)
{
sb.Append("
 " + f.ToString() + " = " +
f.GetValue(o));
}
}
else
sb.Append("
 None");
// Include information for each Property
sb.Append("

Properties:");
System.Reflection.PropertyInfo[] pi = type.GetProperties();
if (pi.Length > 0)
{
foreach (PropertyInfo p in pi)
{
sb.Append("
 " + p.ToString() + " = " +
p.GetValue(o, null));
}
}
else
sb.Append("
 None");
return sb.ToString();
}

Phương thức DisplayObjectInfo đầu tiên có kiểu hiện tại của tham số đối tượng. Sau quá trình xử lý nó cho ta một danh sách tất cả các trường của đối tượng, có kiểu dữ liệu tên và giá trị của mỗi trường. Tương tự thực hiện với mỗi thuộc tính của đối tượng. Kết quả cuối cùng là một chuỗi gồm có các kiểu đối tượng cũng như tất cả các giá trị của thuộc tính và trường của nó. Sau đó có thể thực hiện bất cứ những gì cần với chuỗi này. Nó có thể được hiển thị trên một biểu mẫu, trong một hộp thông báo, gửi đến một bản ghi sự kiện…. Ở đây, chúng ta sẽ sử dụng ví dụ về việc gửi nội dung của đối tượng GPSLocation từ một tip trước đó đến cửa sổ đầu ra.

GPSLocation Location = new GPSLocation(39, -86, 50, 180);
Debug.Print(Util.DisplayObjectInfo(Location));

Các kết quả trong cửa sổ đầu ra:

Type: GPSLocation
Fields:
None
Properties:
Double Latitude = 39
Double Longitude = -86
Int32 Speed = 50
Int32 Direction = 180

Với kiểu thông tin chuẩn đoán này, nó sẽ giúp cho chúng ta dễ dàng hơn trong việc gỡ lỗi. Rõ ràng, bạn hoàn toàn có thể chọn để xuất ra các kết quả theo bất cứ định dạng nào và đến bất cứ nguồn nào phù hợp với bạn. Kiểu phương thức này cũng rất hữu dụng nếu bạn cần phải kết xuất trạng thái các đối tượng khi một ngoại lệ xuất hiện.

0