2009-12-04 2 views

ответ

2

Это, вероятно, итерация через элементы через отражение.

0

Метод 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 
+0

Нет, нет. Класс, который я пытаюсь вывести, не имеет переопределенного ToString, и я не хочу его писать. Но ближайшее окно как-то печатает все. Я ищу этот магический метод. – alga

+0

Здесь нет магического метода. VS просто вызывает или оценивает членов посредством отражения. –

+0

Что сказал Янн. VS использует отражение структуры, и вы можете сделать то же самое. См. Редактирование кода. – invert

4

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

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; } 
    } 
}  
+0

Спасибо. Если я не найду API, я, вероятно, воспользуюсь вашим кодом. – alga

Смежные вопросы