Как непосредственное окно визуальной студии печатает всех членов объекта?

Как я могу с помощью окна вывода написать все элементы объекта? Trace.WriteLine использует метод ToString и не выводит все элементы. Есть ли API, чтобы сделать это без написания собственного кода?

3 ответа

Вы можете сделать что-то вроде этого:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

 namespace ConsoleApplication2
 {
     class Program
     {
         static void Main(string[] args)
         {
             var m = new MyClass { AString = "somestring", AnInt = 60 };

             Console.WriteLine(GetObjectInfo(m));

             Console.ReadLine();
         }

         private static string GetObjectInfo(object o)
         {
             var result = new StringBuilder();

             var t = o.GetType();

             result.AppendFormat("Type: {0}\n", t.Name);

             t.GetProperties().ToList().ForEach(pi => result.AppendFormat("{0} = {1}\n", pi.Name, pi.GetValue(o, null).ToString()));

             return result.ToString();
         }
     }

     public class MyClass
     {
         public string AString { get; set; }
         public int AnInt { get; set; }
     }
}    

Это, вероятно, перебирает участников через рефлексию.

Метод ToString() для конкретного объекта вызывается, и если этот метод был переопределен для отображения всех членов, тогда все в порядке. Однако не у всех объектов реализованы методы ToString(), и в этом случае метод возвращает информацию о типе объекта.

Вместо вызова ToString() напишите пользовательскую функцию, которая использует отражение для перечисления членов объекта, и выведите ее.

Редактировать: эта функция будет возвращать свойства данного объекта, добавлять методы, события все остальное, что вам нужно. (Это на VB, нет C# на этом рабочем ПК)

Function ListMembers(ByVal target As Object) As String

    Dim targetType As Type = target.GetType 

    Dim props() As Reflection.PropertyInfo = targetType.GetProperties

    Dim sb As New System.Text.StringBuilder

    For Each prop As Reflection.PropertyInfo In props
        sb.AppendLine(String.Format("{0} is a {1}", prop.Name, prop.PropertyType.FullName))
    Next

    Return sb.ToString

End Function
Другие вопросы по тегам