Как я могу использовать окно вывода написать все члены объекта? Trace.WriteLine использует метод ToString и не выводит всех членов. Есть ли API для этого, не написав собственный код?Как непосредственно окно визуальной студии печатает все элементы объекта?
ответ
Это, вероятно, итерация через элементы через отражение.
Метод ToString() для конкретного объекта вызывается, и если этот метод был переопределен для отображения всех членов, то он отлично. Однако не все объекты имеют свои методы ToString(), и в этом случае метод возвращает информацию типа объекта.
Вместо вызова ToString() напишите пользовательскую функцию, которая использует reflection to enumerate the object members, и выведите это.
Редактировать: Эта функция возвращает свойства данного объекта, добавляет методы, события, все, что вам нужно. (Это в 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
Вы можете сделать что-то вроде этого:
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; }
}
}
Спасибо. Если я не найду API, я, вероятно, воспользуюсь вашим кодом. – alga
Нет, нет. Класс, который я пытаюсь вывести, не имеет переопределенного ToString, и я не хочу его писать. Но ближайшее окно как-то печатает все. Я ищу этот магический метод. – alga
Здесь нет магического метода. VS просто вызывает или оценивает членов посредством отражения. –
Что сказал Янн. VS использует отражение структуры, и вы можете сделать то же самое. См. Редактирование кода. – invert