Как непосредственное окно визуальной студии печатает все элементы объекта? - PullRequest
1 голос
/ 04 декабря 2009

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

Ответы [ 3 ]

4 голосов
/ 04 декабря 2009

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

 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; }
     }
}    
2 голосов
/ 04 декабря 2009

Вероятно, он перебирает членов через отражение.

0 голосов
/ 04 декабря 2009

Метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...