Как непосредственное окно визуальной студии печатает всех членов объекта?
Как я могу с помощью окна вывода написать все элементы объекта? 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