Я думаю, что вы ищете PropertyInfo.GetValue
. Возможно, что-то подобное поможет (по памяти, надеюсь, оно будет работать как есть):
public static void DumpProperties(this Object dumpWhat)
{
foreach(PropertyInfo prop in dumpWhat.GetType().GetProperties())
Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(dumpWhat, BindingFlags.GetProperty, null, null, null).ToString());
}
Вы также можете сделать что-то похожее с полями вашего объекта, если вы склонны использовать их вместо свойств.
public static void DumpFields(this Object dumpWhat)
{
foreach(FieldInfo fld in dumpWhat.GetType().GetFields())
Console.WriteLine("{0} = {1}", fld.Name, fld.GetValue(dumpWhat, BindingFlags.GetField, null, null, null).ToString());
}
Они будут выгружаться в консоль, но это должно быть достаточно просто, чтобы изменить их для записи в любой поток.
Обновление
Если вы начнете получать NullReferenceException
из свойства, которое не было установлено, вместо того, чтобы обернуть его в try...catch
, вам следует провести некоторые упреждающие проверки относительно значения, возвращенного из PropertyInfo.GetValue
:
public static void DumpProperties(this Object dumpWhat)
{
foreach(PropertyInfo prop in dumpWhat.GetType().GetProperties())
{
string propVal = prop.GetValue(dumpWhat, BindingFlags.GetProperty, null, null, null) as string;
if (propVal != null)
Console.WriteLine("{0} = {1}", prop.Name, propVal);
}
}