2012-05-17 2 views
4

Я пытаюсь написать общую функцию, с которой я могу передать объект, и будет распечатывать все свойства и значения в C#.Generic Object Debugger

Я пробовал много примеров там, как this, и некоторые другие, как

public void PrintProperties(object obj) 
    { 
     PrintProperties(obj, 0); 
    } 
    public void PrintProperties(object obj, int indent) 
    { 
     if (obj == null) return; 
     string indentString = new string(' ', indent); 
     Type objType = obj.GetType(); 
     PropertyInfo[] properties = objType.GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      object propValue = property.GetValue(obj, null); 
      if (property.PropertyType.Assembly == objType.Assembly) 
      { 
       Console.WriteLine("{0}{1}:", indentString, property.Name); 
       PrintProperties(propValue, indent + 2); 
      } 
      else 
      { 
       Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); 
      } 
     } 
    } 

и

foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj)) 
     { 
      string name = descriptor.Name; 
      object value = descriptor.GetValue(obj); 
      Console.WriteLine("{0}={1}", name, value); 
     } 

, но некоторые объекты я хочу в моей отладки/лог-файлы содержат string []. Все эти примеры вывести как

System.String[] 

если я имел объект как

class Thing 
{ 
    public string Name { get; set; } 

    public int Number { get; set; } 

    public string[] Names { get; set; } 
} 

я бы ожидать, чтобы увидеть в журнале, как пыльник с любыми значениями были установлены

Name: Test 
Number: 3 
Names[0]: Fred 
Names[1]: John 
Names[2]: Jimmy 

Thank вы для любой помощи =]

Это класс, в котором я закончил использование

class Descriptor 
{ 
    public void PrintProperties(object obj) 
    { 
     PrintProperties(obj, 0); 
    } 
    public void PrintProperties(object obj, int indent) 
    { 
     if (obj == null) return; 
     string indentString = new string(' ', indent); 
     Type objType = obj.GetType(); 
     PropertyInfo[] properties = objType.GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      object propValue = property.GetValue(obj, null); 

      if (propValue.GetType().IsArray) 
      { 
       object[] arrary = (object[]) propValue; 
       foreach (string value in arrary) 
       { 
        if (property.PropertyType.Assembly == objType.Assembly) 
        { 
         Console.WriteLine("{0}{1}:", indentString, property.Name); 
         PrintProperties(value, indent + 2); 
        } 
        else 
        { 
         Console.WriteLine("{0}{1}: {2}", indentString, property.Name, value); 
        } 
       } 
       continue; 
      } 

      if (property.PropertyType.Assembly == objType.Assembly) 
      { 
       Console.WriteLine("{0}{1}:", indentString, property.Name); 
       PrintProperties(propValue, indent + 2); 
      } 
      else 
      { 
       Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); 
      } 
     } 
    } 

} 

Теперь я собираюсь использовать Log4Net с этим классом, и теперь на протяжении всего моего mvc3 сайта я могу назвать это с ViewModels времени служило и отправил, чтобы получить комплексную отладку при включении

+0

'propValue.ToString(). EndsWith (" [] ")' НЕ является хорошим способом проверить, является ли результат массивом! – leppie

+1

Я обновил эту строку до 'propValue.GetType(). IsArray' - это лучше? – Zac

+1

1 миллион раз лучше :) – leppie

ответ

4

Если вы не ум с использованием Windows Forms, есть элемент управления, называемый PropertyGrid, который в основном делает то, что вы хотите: http://msdn.microsoft.com/en-us/library/system.windows.forms.propertygrid(v=vs.90).aspx

Теперь, для вашей конкретной проблемы, проблема в том, что вы не смотрите внутрь массива. Что вы должны сделать, так это посмотреть на тип каждого свойства. Если это тип массива, тогда вам нужно передать значение в массив object[], а затем перебрать каждый элемент, а не просто распечатать вывод ToString(). Вам также потребуется создать рекурсивный алгоритм, который будет выглядеть внутри каждого свойства и обрабатывать его как объект, который имеет свойства, которые нужно повторить. Если вам нужна помощь в этом, дайте мне знать.

+0

Эй, спасибо за ваш быстрый ответ. Если бы вы могли дать мне быстрый пример, который был бы очень приятным. Благодарю. – Zac

+0

@Zac пример чего? – siride

+0

, отбрасывая значение в массив объектов, а затем перебирает каждый элемент, а не просто выводит вывод значения ToString(). создайте рекурсивный алгоритм, который просматривает каждое свойство и обрабатывает его как объект, который имеет свойства, которые нужно повторить. – Zac