Я пытаюсь написать общую функцию, с которой я могу передать объект, и будет распечатывать все свойства и значения в 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 времени служило и отправил, чтобы получить комплексную отладку при включении
'propValue.ToString(). EndsWith (" [] ")' НЕ является хорошим способом проверить, является ли результат массивом! – leppie
Я обновил эту строку до 'propValue.GetType(). IsArray' - это лучше? – Zac
1 миллион раз лучше :) – leppie