我正在尝试编写一个通用函数,我可以将对象传递给它,它将打印出 c# 中的所有属性和值。
我已经尝试了很多这样的例子,还有一些像这样的例子
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
谢谢你的帮助=]
这是我最终使用的课程
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 站点中,我可以调用它,同时提供并发布 ViewModel,以便在打开时获得全面的调试